C#とJavaによる共通鍵交換を学習しています。
作成しているプログラムは以下の流れで処理したいと考えています。
①クライアント(C#)でRSAキーペアを生成する
②クライアントからサーバ(Java, SpringMVC)へBase64でエンコードした公開鍵をPOSTする
③サーバで共通鍵を生成し、受け取った公開鍵を利用して共通鍵を暗号化しクライアントにレスする
【クライアントサイド】
C#
1static void Main(string[] args) { 2 // RSAキーペアを生成 3 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 4 // 公開鍵を取り出してBase64でエンコード 5 String encPublicKey = Convert.ToBase64String(rsa.ExportCspBlob(false)); 6 Console.WriteLine(encPublicKey); // デバッグのためコンソール出力 7 // エンコードした公開鍵をパラメータにしてサーバへPOST 8 String url = "http://localhost/rsasample/"; 9 String param = ""; 10 var dic = new Dictionary<String, String>(); 11 dic["key"] = encPublicKey; 12 foreach (String key in dic.Keys) { 13 param += String.Format("{0}={1}&", key, dic[key]); 14 } 15 byte[] data = Encoding.UTF8.GetBytes(param); 16 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 17 request.Method = "POST"; 18 request.ContentType = "application/x-www-form-urlencoded"; 19 request.ContentLength = data.Length; 20 using (Stream reqStream = request.GetRequestStream()) 21 reqStream.Write(data, 0, data.Length); 22 23 // 以下返ってきた共通鍵を復号する処理へ 24}
【サーバサイド】
Java
1@RequestMapping(value = "/rsasample/", method = RequestMethod.POST) 2@ResponseBody 3public String rsasample(@RequestParam String key) { 4 Log.info(key); // Base64エンコード文字列を確認するためログ出力 5 byte[] decodeKey = Base64.getDecoder().decode(key); 6 7 // 以下受け取った公開鍵で共通鍵を暗号化してレスポンスする処理へ 8}
上記プログラム実行時にサーバサイドで受け取ったkeyをdecodeすると以下のエラーが発生します。
java.lang.IllegalArgumentException: Illegal base64 character 20
at java.util.Base64$Decoder.decode0(Unknown Source)
at java.util.Base64$Decoder.decode(Unknown Source)
at java.util.Base64$Decoder.decode(Unknown Source)
ちなみにクライアントサイドで以下のように文字列をBase64エンコードして送った場合はサーバサイドでも正常にBase64デコードすることができました。
C#
1// String encPublicKey = Convert.ToBase64String(rsa.ExportCspBlob(false)); 2String encPublicKey = Convert.ToBase64String(Encoding.UTF8.GetBytes("あいうえお"));
またソースファイルの文字コードはC#, JavaともにUTF-8となっています。
怪しい点等ご教授いただければ幸いです。
回答1件
あなたの回答
tips
プレビュー