Java 暗号化 C# 復号化
-
22-09-2019 - |
質問
RSA がデータを暗号化して C# に渡すモジュールを入手しました。C# は、公開キー (64 ビットでエンコード) と渡されたトークンに基づいてそれを復号化する必要があります。
私は token 、64 ビットでエンコードされた公開鍵を持っています。これは、サンプルを開始するのに役立ちます。Java側から私が知っているのは、それが使用されているということだけです。Java 側から結果を取得したので、これを復号化するために C# でパーサーを作成する必要があります。公開キーとトークンの両方を文字列値として取得します。
Cipher cipher = Cipher.getInstance(ALGORITHM); //Algorithm = "RSA"
cipher.init(Cipher.DECRYPT_MODE, key);
ありがとう
解決
始めるには、次のものが必要です。 プライベート メッセージを復号化するためのキー。「公開鍵 (64 ビットエンコード)」ということで、実際に持っているのは、「----- BEGIN CERTIFICATE-----」というヘッダー行と、 「-----END CERTIFICATE-----」というフッター。
それが正しい場合は、秘密キーを見つける必要があります。これは、拡張子「.p12」または「.pfx」が付いた PKCS #12 形式のファイルに保存される場合があります。秘密キーがそのようなファイルに保存されている場合、秘密キーにアクセスするにはパスワードが必要になります。
あるいは、OpenSSL およびその他のユーティリティは、Base-64 でエンコードされた秘密キー ファイルまたはバイナリ形式の秘密キー ファイルを使用します。これらにはさまざまな拡張子があり、パスワードで保護されている場合とそうでない場合があります。ファイルのヘッダー行に「-----BEGIN RSA PRIVATE KEY-----」または「-----BEGIN PRIVATE KEY-----」がある場合、それが実際には秘密キーです。 。
最後に、Windows は秘密キーを内部キー ストアに保存できます。
秘密キーの場所を明確にしたら、質問を更新してください。
秘密キーが Java 側で使用される場合、デジタル署名を実行しようとする可能性があります。私がテストしたいくつかの Java プロバイダーはすべて、この方法で (不正に) 使用した場合に正しい結果を生成しますが、署名を行っている場合は、 Signature
クラスを使用する必要があります。C# コードでは、署名を「検証」するために署名オブジェクトも使用する必要があります。
暗号化は秘密鍵を使用して実行されます。以来、 公共 鍵は 公共、 誰でもメッセージを解読できます。つまり、メッセージは機密ではありません。公開キーは、署名されたメッセージを検証するために受信者によって使用されます。
他のヒント
このコードをチェックしてください。
public static string Decrypt(string inputText)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
byte[] encryptedData = Convert.FromBase64String(inputText.Replace(" ","+"));
PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT);
using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
{
using (MemoryStream memoryStream = new MemoryStream(encryptedData))
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
byte[] plainText = new byte[encryptedData.Length];
int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length);
return Encoding.Unicode.GetString(plainText, 0, decryptedCount);
}
}
}