لقد قمت مؤخرًا بكتابة خادم رسائل Java، وأحتاج أيضًا إلى إنشاء إصدار .NET من العميل. إنهم بحاجة إلى التواصل بشكل آمن، بناءً على بعض بروتوكولات التشفير البسيطة، باستخدام تشفير المفتاح العام، والتشفير المتماثل، وخوارزميات التجزئة. خلال هذه العملية، اكتسبت فهمًا معينًا لأجزاء التشفير في هاتين المنصتين، وإليك بعضًا من فهمي الجديد.
1. التشفير المتماثل
1) التشفير المتماثل لـ Java 1.5 بسيط جدًا ويوفر المزيد من الخوارزميات. يمكن القول أنه سهل الاستخدام، ومقاوم للخداع، ويعمل بكامل طاقته.
على سبيل المثال:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES")
;
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decryptText = cipher.doFinal(data);
2) بالنسبة للتشفير المتماثل لـ .NET 2.0، يكون وضع التشفير الافتراضي هو CBC. عند تشفير CBC، يلزم وجود مفتاح ومتجه التهيئة IV، مما يجعل استخدامه غير مريح للمبتدئين التعامل معها، مجرد تعديل التكوين.
خوارزمية SymmetricAlgorithm = SymmetricAlgorithm.Create(algorithmName);
Algorithm.Mode = CipherMode.ECB;
خوارزمية.مفتاح = مفتاح؛
خوارزمية.Padding = PaddingMode.PKCS7؛ بعد هذا الإعداد، يمكنك التواصل مع Java وتشفير وفك تشفير بعضها البعض.
3) فيما يتعلق بـ .NET 2.0 وJava 1.5، تختلف أسماء خوارزميات التشفير قليلاً في بعض الأماكن.
AES <==> ريجنديل
DESede <==> TripleDES
يبدو أن هذا هو المنطق السليم.
2. خوارزمية تشفير المفتاح العام RSA
1) في Java 1.5، يتم ترميز مصفوفة البايت التي تم الحصول عليها عن طريق تنفيذ getEncoded() على RSAPublicKey بـ ASN.1. لعكس ذلك، تحتاج إلى استخدام X509EncodedKeySpec. تحتاج إلى قراءة تفاصيل المستند أو أن يكون لديك فهم معين للتشفير لمعرفة هذه التفاصيل. على سبيل المثال:
// المفتاح العام ==> بايت
المفتاح العام المفتاح العام =
byte[] RawPublicKey = publicKey.getEncoded();
// bytes ==> المفتاح العام
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(rawPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
مفتاح newPublicKey = keyFactory.generatePublic(x509KeySpec);
بالإضافة إلى ذلك، فإن جزء تشفير المفتاح العام في Java سهل الاستخدام للغاية. لا يزال النمط بسيطًا في الوظيفة، وسهل الاستخدام، ويعمل بكامل طاقته.
في Java، يتم دعم ترميز ASN.1، ولكنه مخفي وغير مرئي تمامًا للمستخدمين.
2) في .NET 2.0، يكون التصميم مربكًا بعض الشيء ولا يدعم تشفير ASN.1. ولكن يبدو أن Mono تدعم تشفير ASN.1. لهذا السبب، قمت باستعارة تطبيق Java Kaiyuan JCE وقمت بتنفيذ إصدار .NET من ASN Parser وASN Builder، والذي استغرق يومين. على النحو التالي:
معلمات RSAParameters العامة الثابتة ASN1ToPublicKey(بايت[] 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
byte[] modulus = pubKey.Modulus;
byte[] publicExponent = pubKey.PublicExponent;
RSAParameters pram = new RSAParameters();
pram.Modulus = modulus;
pram.Exponent = publicExponent;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(pram)
;
}
البايت العام الثابت[] PublicKeyToASN1(RSAParameters pram)
{
معلومات SubjectPublicKeyInfo = جديد SubjectPublicKeyInfo(
معرف الخوارزمية الجديد (PKCSObjectIdentifiers.rsaEncryption،
new DERNull())، new RSAPublicKeyStructure(pram.Modulus, pram.Exponent).DERObject);
byte[] RawPublicKey = info.GetDEREncoded();
إرجاع المفتاح العام الخام؛
}
3. الشعور العام
1) تم تصميم وحدة الأمان الخاصة بـ Java بشكل جيد وبسيطة وسهلة الاستخدام ولها وظائف كاملة.
2) .NET 2.0 فوضوي بعض الشيء، وأسلوب التسمية وإطار عمل النظام غير متناسقين إلى حد ما، والوظائف غير موجودة، وتنظيم التعليمات البرمجية ليس مثاليًا.
3) في Mono، يعد الدعم الأمني أفضل مما أصدرته Microsoft. يمكنك أن ترى من الإنترنت أن بعض ميزات .NET Framework 2.0 مستعارة أيضًا من Mono.
4) يمكن اعتبار أن فريق تطوير وحدة تشفير .NET قد لا يكون قادرًا جدًا. وكما يقول المثل، "كتابة التعليمات البرمجية السيئة ليست من اختصاصنا".
http://www.cnblogs.com/jobs/archive/2006/09/22/512297.html