Recentemente estou escrevendo um servidor de mensagens Java e também preciso criar uma versão .NET do cliente. Eles precisam se comunicar de forma segura, com base em alguns protocolos criptográficos simples, usando criptografia de chave pública, criptografia simétrica e algoritmos Hash. Durante esse processo, adquiri uma certa compreensão das partes de criptografia dessas duas plataformas. Aqui estão alguns dos meus novos entendimentos.
1. Criptografia simétrica
1) A criptografia simétrica do Java 1.5 é muito simples e fornece mais algoritmos. Pode-se dizer que é simples de usar, infalível e totalmente funcional.
Por exemplo:
SecretKeySpec skeySpec = new SecretKeySpec(chave, "AES")
;
cipher.init(Cipher.DECRYPT_MODE,skeySpec);
byte[] decryptText = cipher.doFinal(dados);
2) Para criptografia simétrica do .NET 2.0, o modo de criptografia padrão é CBC. Ao criptografar CBC, são necessários uma chave e um vetor de inicialização IV, o que tornará o uso inconveniente para iniciantes. lidar, basta modificar a configuração.
Algoritmo SymmetricAlgorithm = SymmetricAlgorithm.Create(algorithmName);
algoritmo.Mode = CipherMode.ECB;
algoritmo.Key = chave;
algoritmo.Padding = PaddingMode.PKCS7; Após esta configuração, você pode se comunicar com Java e criptografar e descriptografar um ao outro.
3) Em termos de .NET 2.0 e Java 1.5, os nomes dos algoritmos de criptografia são ligeiramente diferentes em alguns lugares.
AES <==> Rijndael
DESede <==> TriploDES
Isto parece ser senso comum.
2. Algoritmo de criptografia de chave pública RSA
1) Em Java 1.5, a matriz de bytes obtida executando getEncoded() em RSAPublicKey é codificada em ASN.1. Para reverter isso, você precisa usar X509EncodedKeySpec. Você precisa ler os detalhes do documento ou ter um certo conhecimento de criptografia para saber esse detalhe. Por exemplo:
//chave pública ==> bytes
Chave Pública Chave Pública =
byte[] rawPublicKey = publicKey.getEncoded();
// bytes ==> chave pública
X509EncodedKeySpec x509KeySpec = novo X509EncodedKeySpec(rawPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Chave newPublicKey = keyFactory.generatePublic(x509KeySpec);
Além disso, a parte de criptografia de chave pública do Java é bastante fácil de usar. O estilo ainda é simples em função, infalível de usar e totalmente funcional.
Em Java, a codificação ASN.1 é suportada, mas está oculta e completamente invisível para os usuários.
2) No .NET 2.0, o design é um pouco confuso e não oferece suporte à codificação ASN.1. Mas Mono parece estar oferecendo suporte à codificação ASN.1. Por esse motivo, peguei emprestada uma implementação Java Kaiyuan JCE e implementei uma versão .NET do ASN Parser e do ASN Builder, o que levou dois dias. do seguinte modo:
RSAParameters estáticos públicos ASN1ToPublicKey(byte[] rawPublicKey)
{
ASN1InputStream asnInput = novo ASN1InputStream(rawPublicKey);
ASN1Sequence asnSeq = (ASN1Sequence)asnInput.ReadObject();
SubjectPublicKeyInfo subjectPublicKeyInfo = novo SubjectPublicKeyInfo (asnSeq);
DERObjectIdentifier algOid = subjectPublicKeyInfo.AlgorithmId.ObjectId
;
(ASN1Sequence)subjectPublicKeyInfo.PublicKey
byte[] módulo = pubKey.Modulus);
byte[] publicExponent = pubKey.PublicExponents
pram = new RSAParameters();
pram.Modulus = módulo;
pram.Exponent = publicExponent
RSACryptoServiceProvider rsa = novo RSACryptoServiceProvider();
rsa.ImportParameters(pram)
;
}
byte estático público[] PublicKeyToASN1(RSAParameters pram)
{
Informações do SubjectPublicKeyInfo = new SubjectPublicKeyInfo(
novo AlgorithmIdentifier (PKCSObjectIdentifiers.rsaEncryption,
novo DERNull()), novo RSAPublicKeyStructure(pram.Modulus, pram.Exponent).DERObject
byte[] rawPublicKey = info.GetDEREncoded();
retornar rawPublicKey;
}
3. Sentimento geral
1) O módulo de segurança do Java é bem projetado, simples e fácil de usar e possui funções completas.
2) O .NET 2.0 é um pouco confuso, o estilo de nomenclatura e a estrutura do sistema são um tanto inconsistentes, as funções estão faltando e a organização do código não é ideal.
3) No Mono, o suporte de segurança é melhor do que o lançado pela Microsoft. Você pode ver na Internet que alguns recursos do .NET Framework 2.0 também foram emprestados do Mono.
4) Pode-se até considerar que a equipe de desenvolvimento do módulo de criptografia .NET pode não ser muito capacitada. Como diz o ditado: “Escrever código ruim não é nosso”.
http://www.cnblogs.com/jobs/archive/2006/09/22/512297.html