none
C#でRSA復号化する際にCryptographicExceptionが発生する。 RRS feed

  • 質問

  • いつも、皆様の質問・解答にお世話になっております。

     

    さて、javaで書かれたGAEのサーブレットにC#よりリクエストを投げ、結果を取得するなどの機能の部分を実装しているのですが、C#側で復号化する際に例外が発生し、よくわかりません。。

    RSACryptoServiceProviderクラスのToXmlString(false)で取得できるような、XMLの値をJava側で生成しています。

    この値をC#が公開鍵として利用し、復号化できないかと思っているのです。

    しかしながら、このような処理をすると、CryptographicExceptionが発生し、復号化できません、そこでC#で公開鍵を生成->ToXmlString(false)->別のRsaCryptoServiceProviderインスタンスで、FromXmlStringを実行し読み込ませ、復号化を試みました。

                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                string publickey = rsa.ToXmlString(false);
                byte[] encrypt = rsa.Encrypt(Encoding.Unicode.GetBytes("C# EncryptTest"),false);
                RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider();
                rsa2.FromXmlString(publickey);
                byte[] decrypt = rsa2.Decrypt(encrypt,false);//ここにおいて、CryptographicExceptionが発生。
                
                Console.WriteLine("Encrypted:" + Encoding.Unicode.GetString(encrypt));
                Console.WriteLine("Decrypted:" + Encoding.Unicode.GetString(decrypt));
                Console.WriteLine("Xmlstring:" + publickey);
    


    私の認識では、このToXmlStringで取得した値は、暗号化の公開鍵のような振る舞いをするのかと思っていたのですが、違うのでしょうか。。

    そもそも、自分の認識が違う気がします。。

    2011年9月7日 22:07

回答

  • 秘密鍵で符号化て公開鍵で復号化することで、発信者の検証を行いたいということですね?

    .NET Framework の公開鍵暗号プロバイダでは、セキュリティ的な安全性を確保するために秘密鍵で符号化されたデータを公開鍵で復号することはできないようになっています。(なぜか符号化はできます) 発信者の検証には署名を使用する設計になっており、Encrypt(), Decrypt() のかわりに SignData(), VerifySign() を使用してください。(こちらのメソッドは、逆に公開鍵で署名して、秘密鍵で検証することはできなくなっています)
    ※ 暗号化について安全な運用を行うためのポリシーを強制しているということです。レムライムさんの考え方や操作が間違っているわけではありません。

     

    2011年9月8日 0:43

すべての返信

  • 公開鍵を使って暗号化、秘密鍵を使って復号では。なので ToXmlString(true) にしない限り復号に失敗するかと。
    2011年9月7日 22:29
  • 秘密鍵で符号化て公開鍵で復号化することで、発信者の検証を行いたいということですね?

    .NET Framework の公開鍵暗号プロバイダでは、セキュリティ的な安全性を確保するために秘密鍵で符号化されたデータを公開鍵で復号することはできないようになっています。(なぜか符号化はできます) 発信者の検証には署名を使用する設計になっており、Encrypt(), Decrypt() のかわりに SignData(), VerifySign() を使用してください。(こちらのメソッドは、逆に公開鍵で署名して、秘密鍵で検証することはできなくなっています)
    ※ 暗号化について安全な運用を行うためのポリシーを強制しているということです。レムライムさんの考え方や操作が間違っているわけではありません。

     

    2011年9月8日 0:43
  • 仕様だったのですね。

    疑問解消しました。ありがとうございました。なんとか、解決できそうです。

    2011年9月8日 7:45