最近、Java メッセージ サーバーを作成しているのですが、.NET バージョンのクライアントも作成する必要があります。これらは、公開キー暗号化、対称暗号化、およびハッシュ アルゴリズムを使用した、いくつかの単純な暗号化プロトコルに基づいて安全に通信する必要があります。このプロセス中に、これら 2 つのプラットフォームの暗号化部分について一定の理解を得ることができました。新たに理解した点をいくつか紹介します。
1. 対称暗号化
1) Java 1.5 の対称暗号化は非常にシンプルで、より多くのアルゴリズムを提供します。使いやすく、簡単で、機能が充実していると言えます。
例えば:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
暗号暗号 = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decryptText = cipher.doFinal(data);
2) .NET 2.0 の対称暗号化の場合、デフォルトの暗号化モードは CBC であり、CBC を暗号化するときにキーと初期化ベクトル IV が必要になるため、初心者にとっては非常に使いにくい問題です。対処するには、設定を変更するだけです。
SymmetricAlgorithm アルゴリズム = SymmetricAlgorithm.Create(algorithmName);
アルゴリズム.モード = CipherMode.ECB;
アルゴリズム.キー = キー;
Algorithm.Padding = PaddingMode.PKCS7; この設定の後、Java と通信して相互に暗号化および復号化できるようになります。
3) .NET 2.0 と Java 1.5 では、暗号化アルゴリズムの名前が若干異なる箇所があります。
AES <==> ラインダール
DESede <==> TripleDES
これは常識のようです。
2. 公開鍵暗号アルゴリズム RSA
1) Java 1.5 では、RSAPublicKey に対して getEncoded() を実行して得られるバイト配列は ASN.1 でエンコードされます。これを元に戻すには、X509EncodedKeySpec を使用する必要があります。この詳細を知るには、ドキュメントの詳細を読むか、暗号化についてある程度の知識が必要です。例えば:
//公開鍵 ==> バイト
パブリックキー publicKey =
byte[] rawPublicKey = publicKey.getEncoded();
// バイト ==> 公開鍵
X509EncodedKeySpec x509KeySpec = 新しい 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 実装を借用し、ASN Parser と ASN Builder の .NET バージョンを実装しました。これには 2 日かかりました。次のように:
public static RSAParameters ASN1ToPublicKey(byte[] rawPublicKey)
{
ASN1InputStream asnInput = 新しい 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.PublicExponent
RSAParameters pram = new RSAParameters();
pram.Modulus = モジュラス;
pram.Exponent = publicExponent
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(pram);
戻り値
]
PublicKeyToASN1(RSAParameters pram)
{
SubjectPublicKeyInfo 情報 = new SubjectPublicKeyInfo(
新しい AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption,
new DERNull())、new RSAPublicKeyStructure(pram.Modulus, pram.Exponent).DERObject);
byte[] rawPublicKey = info.GetDEREncoded();
rawPublicKey を返します。
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