teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

ご指摘頂いた点から修正したコードを追記

2020/12/14 05:23

投稿

tomy-c
tomy-c

スコア179

title CHANGED
File without changes
body CHANGED
@@ -97,6 +97,82 @@
97
97
  }
98
98
  ```
99
99
 
100
+ ###指摘後修正(ベストアンサー後)
101
+ ※今回の問題はそもそも自身のイメージしているバイナリファイルの概念が間違っているのが原因でした。
102
+  そのため、異常して上げた箇所の動作はそもそもが正常な動作であり、それを間違った解釈から異常と判断していたのが問題でした。
103
+ ```C#
104
+ /// <summary>
105
+ /// 公開鍵、秘密鍵のペアを作成してファイル出力する
106
+ /// </summary>
107
+ /// <returns>作成した鍵のファイルを格納したフォルダパス。失敗時はNull</returns>
108
+ public static string PutRSAKey()
109
+ {
110
+
111
+ string putdir = Directory.GetCurrentDirectory() + "/Keypair_" + DateTime.Now.ToString("yyyyMMddHHmmss") + "/";
112
+ string pub_file_path = putdir + "public.dat";
113
+ string pri_file_path = putdir + "private.dat";
114
+
115
+ try
116
+ {
117
+ string public_key;
118
+ string private_key;
119
+ using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
120
+ {
121
+ public_key = rsa.ToXmlString(false); //falseで公開鍵だけ返却
122
+ private_key = rsa.ToXmlString(true); //trueで公開、秘密鍵両方を返却
123
+ }
124
+
125
+ //出力フォルダ作成
126
+ if (!Directory.Exists(putdir))
127
+ {
128
+ Directory.CreateDirectory(putdir);
129
+ }
130
+
131
+ //テキスト形式、上書き、UTF-8
132
+ using (var sw = new StreamWriter(pub_file_path))
133
+ {
134
+ sw.Write(Base64Encode(public_key));
135
+ }
136
+ using (var sw = new StreamWriter(pri_file_path))
137
+ {
138
+ sw.Write(Base64Encode(private_key));
139
+ }
140
+
141
+
142
+ return putdir;
143
+ }
144
+ catch
145
+ {
146
+ return null;
147
+ }
148
+ }
149
+
150
+ /// <summary>
151
+ /// Base64で文字列を難読化する
152
+ /// </summary>
153
+ /// <param name="str"></param>
154
+ /// <returns></returns>
155
+ /// <remarks>エンコードはutf-8固定</remarks>
156
+ private static string Base64Encode(string str)
157
+ {
158
+ Encoding enc = Encoding.GetEncoding("UTF-8");
159
+ return Convert.ToBase64String(enc.GetBytes(str));
160
+ }
161
+
162
+ /// <summary>
163
+ /// Base64で難読化された文字列を復号化する
164
+ /// </summary>
165
+ /// <param name="str"></param>
166
+ /// <returns></returns>
167
+ /// <remarks>エンコードはutf-8固定</remarks>
168
+ private static string Base64Decode(string str)
169
+ {
170
+ Encoding enc = Encoding.GetEncoding("UTF-8");
171
+ return enc.GetString(Convert.FromBase64String(str));
172
+ }
173
+
174
+ ```
175
+
100
176
  ### 試したこと
101
177
 
102
178
  ・バイト配列への変換方法を一文字づつに変えた → 変わらず

2

radianさんにご指摘いただいた目的を追記

2020/12/14 05:23

投稿

tomy-c
tomy-c

スコア179

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,6 @@
1
1
  現在、数年来のリハビリがてら、
2
2
  C#のコンソールプログラムでRSAを用いた暗号化プログラムを作っているのですが、公開鍵、秘密鍵を生成し、バイナリファイルで出力しようとしています。
3
+ 成果物としてはRSACryptoServiceProvider.ToXmlStringで出力したstringをテキストエディタで普通に開いただけでは内容が理解できないバイナリファイルにすることをイメージしています。
3
4
 
4
5
  暗号化、復号化に関しては正しく動作するプログラムが完成しているのですが、
5
6
  肝心の公開鍵、秘密鍵をC#のBinaryWriterで出力しても、出力したファイルは普通のテキスト形式で、メモ帳で開いても普通に中身が見れてしまいます。

1

問題発生箇所にコメントを追加

2020/12/14 01:44

投稿

tomy-c
tomy-c

スコア179

title CHANGED
File without changes
body CHANGED
@@ -54,7 +54,7 @@
54
54
  // writer.Write(p[i]);
55
55
  //}
56
56
  Console.WriteLine(p[0].ToString()); //正しくバイト型に変換できている
57
- writer.Write(p,0,p.Length);
57
+ writer.Write(p,0,p.Length); //バイナリ形式で出力(※テキストで出力される)
58
58
  }
59
59
  using (var writer = new BinaryWriter(new FileStream(pri_file_path, FileMode.Create)))
60
60
  {