0

RSA がデータを暗号化して C# に渡すモジュールを入手しました。C# は、公開キー (64 ビット エンコード) と渡されたトークンに基づいて暗号化を解除する必要があります。

私は token 、64 ビットでエンコードされた公開鍵を持っています。サンプルを使用して開始するのに役立つものがあります。私がJavaの終わりから知っているのは、それが使用していることだけです。Java エンドから結果を取得したので、これを解読するために C# でパーサーを作成する必要があります。公開鍵とトークンの両方を文字列値として取得します。

    Cipher cipher = Cipher.getInstance(ALGORITHM); //Algorithm = "RSA"
    cipher.init(Cipher.DECRYPT_MODE, key);

ありがとう

4

2 に答える 2

1

開始するには、メッセージを復号化するための秘密鍵が必要です。「公開鍵 (64 ビット エンコード)」によって、実際に持っているのは Base-64 でエンコードされた証明書であり、「----- BEGIN CERTIFICATE-----」というヘッダー行と、 「-----END CERTIFICATE-----」というフッター。

それが正しければ、秘密鍵を見つける必要があります。これは、拡張子が「.p12」または「.pfx」の PKCS #12 形式のファイルに保存されることがあります。秘密鍵がそのようなファイルに保存されている場合、秘密鍵にアクセスするにはパスワードが必要です。

または、OpenSSL やその他のユーティリティは、Base-64 でエンコードされた、またはバイナリの秘密鍵ファイルを使用します。これらにはさまざまな拡張子があり、パスワードで保護されている場合とされていない場合があります。あなたが持っているファイルに「-----BEGIN RSA PRIVATE KEY-----」または「-----BEGIN PRIVATE KEY-----」のヘッダー行がある場合、それは実際には秘密鍵です.

最後に、Windows は内部キー ストアに秘密キーを格納できます。

秘密鍵の場所を明確にしたら、質問を更新してください。


秘密鍵が Java 側で使用されている場合、デジタル署名を実行しようとしている可能性があります。私がテストしたいくつかの Java プロバイダーはすべて、この方法で (ab) 使用すると正しい結果を生成しますが、署名を行う場合は、Signatureクラスを使用する必要があります。C# コードでは、署名オブジェクトを使用して署名を "検証" する必要もあります。

暗号化は秘密鍵で行います。公開鍵は公開されているため、誰でもメッセージを復号化できます。つまり、メッセージは機密ではありません。公開鍵は、署名されたメッセージを検証するために受信者によって使用されます。

于 2009-10-20T17:51:22.330 に答える
1

このコードをチェックしてください。

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);
            }
          }
        }
于 2009-10-20T17:52:22.663 に答える