Vor kurzem schreibe ich einen Java-Nachrichtenserver und muss auch eine .NET-Version des Clients erstellen. Sie müssen sicher kommunizieren, basierend auf einigen einfachen kryptografischen Protokollen, unter Verwendung von Public-Key-Verschlüsselung, symmetrischer Verschlüsselung und Hash-Algorithmen. Während dieses Prozesses habe ich ein gewisses Verständnis für die Verschlüsselungsteile dieser beiden Plattformen gewonnen. Hier sind einige meiner neuen Erkenntnisse.
1. Symmetrische Verschlüsselung
1) Die symmetrische Verschlüsselung von Java 1.5 ist sehr einfach und bietet mehr Algorithmen. Man kann sagen, dass es einfach zu bedienen, narrensicher und voll funktionsfähig ist.
Zum Beispiel:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decryptText = cipher.doFinal(data);
2) Für die symmetrische Verschlüsselung von .NET 2.0 ist der Standardverschlüsselungsmodus CBC. Für die Verschlüsselung sind ein Schlüssel und ein Initialisierungsvektor IV erforderlich, was die Verwendung für Anfänger unpraktisch macht Um damit umzugehen, ändern Sie einfach die Konfiguration.
SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create(algorithmName);
algorithm.Mode = CipherMode.ECB;
algorithm.Key = Schlüssel;
algorithm.Padding = PaddingMode.PKCS7; Nach dieser Einstellung können Sie mit Java kommunizieren und sich gegenseitig ver- und entschlüsseln.
3) In Bezug auf .NET 2.0 und Java 1.5 unterscheiden sich die Namen der Verschlüsselungsalgorithmen an einigen Stellen geringfügig.
AES <==> Rijndael
DESede <==> TripleDES
Das scheint gesunder Menschenverstand zu sein.
2. Verschlüsselungsalgorithmus mit öffentlichem Schlüssel RSA
1) In Java 1.5 ist das Byte-Array, das durch Ausführen von getEncoded() für RSAPublicKey erhalten wird, ASN.1-codiert. Um dies umzukehren, müssen Sie X509EncodedKeySpec verwenden. Sie müssen die Dokumentdetails lesen oder über ein gewisses Verständnis der Kryptographie verfügen, um diese Details zu kennen. Zum Beispiel:
//öffentlicher Schlüssel ==> Bytes
PublicKey publicKey =
byte[] rawPublicKey = publicKey.getEncoded();
// bytes ==> öffentlicher Schlüssel
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(rawPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Schlüssel newPublicKey = keyFactory.generatePublic(x509KeySpec);
Darüber hinaus ist der Verschlüsselungsteil mit öffentlichem Schlüssel von Java recht einfach zu verwenden. Der Stil ist immer noch einfach in der Funktion, kinderleicht zu bedienen und voll funktionsfähig.
In Java wird die ASN.1-Kodierung unterstützt, sie ist jedoch verborgen und für Benutzer völlig unsichtbar.
2) In .NET 2.0 ist das Design etwas verwirrend und unterstützt keine ASN.1-Kodierung. Aber Mono scheint ASN.1-Codierung zu unterstützen. Aus diesem Grund habe ich mir eine Java Kaiyuan JCE-Implementierung ausgeliehen und eine .NET-Version von ASN Parser und ASN Builder implementiert, was zwei Tage dauerte. wie folgt:
öffentliche statische RSAParameters ASN1ToPublicKey(byte[] rawPublicKey)
{
ASN1InputStream asnInput = new ASN1InputStream(rawPublicKey);
ASN1Sequence asnSeq = (ASN1Sequence)asnInput.ReadObject();
SubjectPublicKeyInfo subjectPublicKeyInfo = new SubjectPublicKeyInfo(asnSeq);
DERObjectIdentifier algOid = subjectPublicKeyInfo.AlgorithmId.ObjectId
pubKey = new RSAPublicKeyStructure(
(ASN1Sequence)subjectPublicKeyInfo.PublicKey);
byte[] modulus = pubKey.Modulus;
byte[] publicExponent = pubKey.PublicExponents
pram = new RSAParameters();
pram.Modulus = modulus;
pram.Exponent = publicExponent;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(pram);
return pram;
}
öffentliches statisches Byte[] PublicKeyToASN1(RSAParameters pram)
{
SubjectPublicKeyInfo info = neues SubjectPublicKeyInfo(
neuer AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption,
new DERNull()), new RSAPublicKeyStructure(pram.Modulus, pram.Exponent).DERObject
byte[] rawPublicKey = info.GetDEREncoded();
return rawPublicKey;
}
3. Gesamtgefühl
1) Das Sicherheitsmodul von Java ist gut gestaltet, einfach und benutzerfreundlich und verfügt über vollständige Funktionen.
2) .NET 2.0 ist etwas chaotisch, der Benennungsstil und das System-Framework sind etwas inkonsistent, es fehlen Funktionen und die Codeorganisation ist nicht ideal.
3) In Mono ist die Sicherheitsunterstützung besser als bei Microsoft. Sie können dem Internet entnehmen, dass einige Funktionen von .NET Framework 2.0 auch von Mono übernommen wurden.
4) Es kann sogar davon ausgegangen werden, dass das Entwicklungsteam des .NET-Verschlüsselungsmoduls möglicherweise nicht sehr leistungsfähig ist. Wie das Sprichwort sagt: „Das Schreiben von schlechtem Code ist nicht unsere Sache.“
http://www.cnblogs.com/jobs/archive/2006/09/22/512297.html