Récemment, j'écris un serveur de messages Java et je dois également créer une version .NET du client. Ils doivent communiquer en toute sécurité, sur la base de protocoles cryptographiques simples, en utilisant le cryptage à clé publique, le cryptage symétrique et les algorithmes de hachage. Au cours de ce processus, j'ai acquis une certaine compréhension des parties de chiffrement de ces deux plates-formes. Voici quelques-unes de mes nouvelles compréhensions.
1. Cryptage symétrique
1) Le cryptage symétrique de Java 1.5 est très simple et fournit plus d'algorithmes. On peut dire qu’il est simple à utiliser, infaillible et entièrement fonctionnel.
Par exemple:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decryptText = cipher.doFinal(data);
2) Pour le cryptage symétrique de .NET 2.0, le mode de cryptage par défaut est CBC. Lors du cryptage CBC, une clé et un vecteur d'initialisation IV sont requis, ce qui rendra l'utilisation peu pratique pour les débutants. traiter, il suffit de modifier la configuration.
Algorithme SymmetricAlgorithm = SymmetricAlgorithm.Create(algorithmName);
algorithm.Mode = CipherMode.ECB ;
algorithm.Key = clé ;
algorithm.Padding = PaddingMode.PKCS7; Après ce paramètre, vous pouvez communiquer avec Java et vous chiffrer et vous décrypter mutuellement.
3) En termes de .NET 2.0 et Java 1.5, les noms des algorithmes de chiffrement sont légèrement différents à certains endroits.
AES <==> Rijndael
DESede <==> TripleDES
Cela semble relever du bon sens.
2. Algorithme de chiffrement à clé publique RSA
1) Dans Java 1.5, le tableau d'octets obtenu en exécutant getEncoded() sur RSAPublicKey est codé en ASN.1. Pour l'inverser, vous devez utiliser X509EncodedKeySpec. Vous devez lire les détails du document ou avoir une certaine compréhension de la cryptographie pour connaître ce détail. Par exemple:
//clé publique ==> octets
Clé publique clé publique =
byte[] rawPublicKey = publicKey.getEncoded();
// octets ==> clé publique
X509EncodedKeySpec x509KeySpec = nouveau X509EncodedKeySpec(rawPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Clé newPublicKey = keyFactory.generatePublic(x509KeySpec);
De plus, la partie chiffrement à clé publique de Java est assez simple à utiliser. Le style reste simple dans sa fonction, infaillible à utiliser et entièrement fonctionnel.
En Java, le codage ASN.1 est pris en charge, mais il est masqué et complètement invisible pour les utilisateurs.
2) Dans .NET 2.0, la conception est un peu déroutante et ne prend pas en charge le codage ASN.1. Mais Mono semble prendre en charge le codage ASN.1. Pour cette raison, j'ai emprunté une implémentation Java Kaiyuan JCE et implémenté une version .NET d'ASN Parser et d'ASN Builder, ce qui a pris deux jours. comme suit:
RSAParameters statiques publics ASN1ToPublicKey (octet [] rawPublicKey)
{
ASN1InputStream asnInput = new ASN1InputStream(rawPublicKey);
ASN1Sequence asnSeq = (ASN1Sequence)asnInput.ReadObject();
SubjectPublicKeyInfo subjectPublicKeyInfo = new SubjectPublicKeyInfo(asnSeq);
DERObjectIdentifier algOid = subjectPublicKeyInfo.AlgorithmId.ObjectId;
RSAPublicKeyStructure pubKey = new RSAPublicKeyStructure(
(ASN1Sequence)subjectPublicKeyInfo.PublicKey);
octet[] module = pubKey.Modulus;
byte[] publicExponent = pubKey.PublicExponent;
RSAParameters pram = new RSAParameters();
landau.Modulus = module;
pram.Exponent = publicExponent;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(pram);
return pram;
}
octet statique public[] PublicKeyToASN1 (pram RSAParameters)
{
Informations sur SubjectPublicKeyInfo = nouveau SubjectPublicKeyInfo (
nouvel AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption,
new DERNull()), new RSAPublicKeyStructure(pram.Modulus, pram.Exponent).DERObject
byte[] rawPublicKey = info.GetDEREncoded();
renvoie rawPublicKey ;
}
3. Sentiment général
1) Le module de sécurité de Java est bien conçu, simple et facile à utiliser, et possède des fonctions complètes.
2) .NET 2.0 est un peu compliqué, le style de dénomination et le cadre système sont quelque peu incohérents, les fonctions font défaut et l'organisation du code n'est pas idéale.
3) Dans Mono, la prise en charge de la sécurité est meilleure que celle publiée par Microsoft. Vous pouvez voir sur Internet que certaines fonctionnalités de .NET Framework 2.0 sont également empruntées à Mono.
4) On peut même considérer que l'équipe de développement du module de chiffrement .NET n'est peut-être pas très compétente. Comme le dit le proverbe, « Écrire du mauvais code n’est pas à nous ».
http://www.cnblogs.com/jobs/archive/2006/09/22/512297.html