Recientemente estoy escribiendo un servidor de mensajes Java y también necesito crear una versión .NET del cliente. Necesitan comunicarse de forma segura, basándose en algunos protocolos criptográficos simples, utilizando cifrado de clave pública, cifrado simétrico y algoritmos Hash. Durante este proceso, obtuve una cierta comprensión de las partes de cifrado de estas dos plataformas. Estos son algunos de mis nuevos conocimientos.
1. Cifrado simétrico
1) El cifrado simétrico de Java 1.5 es muy simple y proporciona más algoritmos. Se puede decir que es sencillo de usar, infalible y totalmente funcional.
Por ejemplo:
SecretKeySpec skeySpec = new SecretKeySpec(clave, "AES");
cifrado cifrado = Cipher.getInstance("AES");
cifrado.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decryptText = cipher.doFinal(datos);
2) Para el cifrado simétrico de .NET 2.0, el modo de cifrado predeterminado es CBC. Al cifrar CBC, se requieren una clave y un vector de inicialización IV, lo que hará que su uso sea inconveniente para los principiantes. tratar, simplemente modifique la configuración.
Algoritmo SymmetricAlgorithm = SymmetricAlgorithm.Create(algorithmName);
algoritmo.Modo = CipherMode.ECB;
algoritmo.Clave = clave;
algoritmo.Padding = PaddingMode.PKCS7 Después de esta configuración, pueden comunicarse con Java y cifrarse y descifrarse entre sí.
3) En términos de .NET 2.0 y Java 1.5, los nombres de los algoritmos de cifrado son ligeramente diferentes en algunos lugares.
AES <==> Rijndael
DESede <==> TripleDES
Esto parece ser de sentido común.
2. Algoritmo de cifrado de clave pública RSA
1) En Java 1.5, la matriz de bytes obtenida al ejecutar getEncoded() en RSAPublicKey está codificada en ASN.1. Para revertirlo, debe utilizar X509EncodedKeySpec. Debe leer los detalles del documento o tener ciertos conocimientos de criptografía para conocer este detalle. Por ejemplo:
//clave pública ==> bytes
Clave pública clave pública =
byte[] rawPublicKey = publicKey.getEncoded();
// bytes ==> clave pública
X509EncodedKeySpec x509KeySpec = nuevo X509EncodedKeySpec(rawPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Clave newPublicKey = keyFactory.generatePublic(x509KeySpec);
Además, la parte de cifrado de clave pública de Java es bastante fácil de usar. El estilo sigue siendo simple en función, infalible de usar y completamente funcional.
En Java, se admite la codificación ASN.1, pero está oculta y es completamente invisible para los usuarios.
2) En .NET 2.0, el diseño es un poco confuso y no admite la codificación ASN.1. Pero Mono parece estar admitiendo la codificación ASN.1. Por esta razón, tomé prestada una implementación Java Kaiyuan JCE e implementé una versión .NET de ASN Parser y ASN Builder, lo que me llevó dos días. como sigue:
RSAParameters estáticos públicos ASN1ToPublicKey (byte [] rawPublicKey)
{
ASN1InputStream asnInput = nuevo ASN1InputStream(rawPublicKey);
Secuencia ASN1 asnSeq = (Secuencia ASN1)asnInput.ReadObject();
SubjectPublicKeyInfo sujetoPublicKeyInfo = nuevo SubjectPublicKeyInfo(asnSeq)
DERObjectIdentifier algOid = sujetoPublicKeyInfo.AlgorithmId.ObjectId
RSAPublicKeyStructure pubKey = nuevo RSAPublicKeyStructure(;
(ASN1Sequence)subjectPublicKeyInfo.PublicKey);
byte[] módulo = pubKey.Modulus;
byte[] publicExponent = pubKey.PublicExponent;
RSAParameters cochecito = new RSAParameters();
cochecito.Modulus = módulo;
pram.Exponent = publicExponent;
RSACryptoServiceProvider rsa = nuevo RSACryptoServiceProvider();
rsa.ImportParameters(cochecito);
devolver cochecito;
}
byte estático público[] PublicKeyToASN1(RSAParameters pram)
{
Información de SubjectPublicKeyInfo = nueva SubjectPublicKeyInfo(
nuevo AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption,
nuevo DERNull()), nuevo RSAPublicKeyStructure(pram.Modulus, pram.Exponent).DERObject);
byte[] rawPublicKey = info.GetDEREncoded();
devolver rawPublicKey;
}
3. Sentimiento general
1) El módulo de seguridad de Java está bien diseñado, es simple y fácil de usar y tiene funciones completas.
2) .NET 2.0 es un poco complicado, el estilo de nombres y el marco del sistema son algo inconsistentes, faltan funciones y la organización del código no es ideal.
3) En Mono, el soporte de seguridad es mejor que el que ha lanzado Microsoft. Puede ver en Internet que algunas características de .NET Framework 2.0 también se han tomado prestadas de Mono.
4) Incluso se puede considerar que el equipo de desarrollo del módulo de cifrado .NET puede no ser muy capaz. Como dice el refrán, "Escribir código incorrecto no es nuestro".
http://www.cnblogs.com/jobs/archive/2006/09/22/512297.html