Baru-baru ini saya sedang menulis server pesan Java, dan saya juga perlu membuat klien versi .NET. Mereka perlu berkomunikasi dengan aman, berdasarkan beberapa protokol kriptografi sederhana, menggunakan enkripsi kunci publik, enkripsi simetris, dan algoritma Hash. Selama proses ini, saya memperoleh pemahaman tertentu tentang bagian enkripsi kedua platform ini.
1. Enkripsi simetris
1) Enkripsi simetris Java 1.5 sangat sederhana dan menyediakan lebih banyak algoritma. Dapat dikatakan mudah digunakan, anti bodoh, dan berfungsi penuh.
Misalnya:
SecretKeySpec skeySpec = new SecretKeySpec(kunci, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decryptText = cipher.doFinal(data);
2) Untuk enkripsi simetris .NET 2.0, mode enkripsi default adalah CBC. Saat mengenkripsi CBC, diperlukan kunci dan vektor inisialisasi IV, yang akan menyulitkan pemula untuk menggunakannya tangani, cukup ubah konfigurasinya.
Algoritma SymmetricAlgorithm = SymmetricAlgorithm.Create(algorithmName);
algoritma.Mode = CipherMode.ECB;
algoritma.Kunci = kunci;
algoritma.Padding = PaddingMode.PKCS7 Setelah pengaturan ini, Anda dapat berkomunikasi dengan Java dan mengenkripsi dan mendekripsi satu sama lain.
3) Dalam hal .NET 2.0 dan Java 1.5, nama algoritma enkripsi sedikit berbeda di beberapa tempat.
AES <==> Rijndael
DESede <==> TripleDES
Tampaknya ini masuk akal.
2. Algoritma enkripsi kunci publik RSA
1) Di Java 1.5, array byte yang diperoleh dengan menjalankan getEncoded() di RSAPublicKey dikodekan ASN.1. Untuk membalikkannya, Anda perlu menggunakan X509EncodedKeySpec. Anda perlu membaca detail dokumen atau memiliki pemahaman tertentu tentang kriptografi untuk mengetahui detail ini. Misalnya:
//kunci publik ==> byte
Kunci Publik Kunci Publik =
byte[] rawPublicKey = publicKey.getEncoded();
// byte ==> kunci publik
X509EncodedKeySpec x509KeySpec = baru X509EncodedKeySpec(rawPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Kunci newPublicKey = keyFactory.generatePublic(x509KeySpec);
Selain itu, bagian enkripsi kunci publik Java cukup mudah digunakan. Fungsinya masih sederhana, mudah digunakan, dan berfungsi penuh.
Di Java, pengkodean ASN.1 didukung, namun tersembunyi dan sama sekali tidak terlihat oleh pengguna.
2) Di .NET 2.0, desainnya agak membingungkan dan tidak mendukung pengkodean ASN.1. Tapi Mono tampaknya melakukan dukungan pengkodean ASN.1. Untuk alasan ini, saya meminjam implementasi Java Kaiyuan JCE dan mengimplementasikan ASN Parser dan ASN Builder versi .NET, yang memakan waktu dua hari. sebagai berikut:
RSAParameter statis publik ASN1ToPublicKey(byte[] rawPublicKey)
{
ASN1InputStream asnInput = ASN1InputStream baru(rawPublicKey);
ASN1Sequence asnSeq = (ASN1Sequence)asnInput.ReadObject();
SubjectPublicKeyInfo subjectPublicKeyInfo = baru SubjectPublicKeyInfo(asnSeq);
DERObjectIdentifier algOid = subjectPublicKeyInfo.AlgorithmId.ObjectId;
RSAPublicKeyStructure pubKey = new RSAPublicKeyStructure(
(ASN1Sequence)subjectPublicKeyInfo.PublicKey);
byte[] modulus = pubKey.Modulus;
byte[] publicExponent = pubKey.PublicExponent;
RSAParameters kereta dorong bayi = RSAParameters();
kereta dorong bayi.Modulus = modulus;
kereta dorong bayi.Exponent = publicExponent;
RSACryptoServiceProvider rsa = RSACryptoServiceProvider() baru;
rsa.ImportParameters(kereta dorong bayi);
kembalikan kereta dorong bayi;
}
byte statis publik[] PublicKeyToASN1(RSAParameter kereta dorong bayi)
{
Info SubjectPublicKeyInfo = baru SubjectPublicKeyInfo(
AlgorithmIdentifier baru (PKCSObjectIdentifiers.rsaEncryption,
DERnull baru()), RSAPublicKeyStructure baru(pram.Modulus, pram.Exponent).DERObject);
byte[] rawPublicKey = info.GetDEREncoded();
kembalikan rawPublicKey;
}
3. Perasaan secara keseluruhan
1) Modul keamanan Java dirancang dengan baik, sederhana dan mudah digunakan, serta memiliki fungsi yang lengkap.
2) .NET 2.0 agak berantakan, gaya penamaan dan kerangka sistem agak tidak konsisten, fungsinya kurang, dan organisasi kode tidak ideal.
3) Di Mono, dukungan keamanan lebih baik daripada yang dirilis Microsoft. Anda dapat melihat dari Internet bahwa beberapa fitur .NET Framework 2.0 juga dipinjam dari Mono.
4) Bahkan dapat dianggap bahwa tim pengembangan modul enkripsi .NET mungkin tidak terlalu mampu. Seperti kata pepatah, "Menulis kode yang buruk bukanlah urusan kami."
http://www.cnblogs.com/jobs/archive/2006/09/22/512297.html