質問編集履歴

4

質問内容修正

2021/11/11 15:26

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- RSA復号化に失敗する
1
+ テキストファイルに保存したキーファイルと初期ベクトルを復号化の時使用するには
test CHANGED
@@ -4,21 +4,9 @@
4
4
 
5
5
  Crypto++のライブラリを使ってます。
6
6
 
7
- 下記コドで復号化するとエラー発生しま。原因と対策方法を教えてくださ
7
+ AES暗号化時にテキストファイルに保存した、キファイルと初期ベクトルを復号化の時にd.SetKeyWithIV(key, key.size(), iv);にセットし直したいのですがどうればいでしょうか?
8
8
 
9
9
  必要な情報があれば追記します。よろしくお願いします。
10
-
11
-
12
-
13
- ### 発生している問題・エラーメッセージ
14
-
15
-
16
-
17
- ```
18
-
19
- RSA/OAEP-MGF1(SHA-1): message length of 1139 exceeds the maximum of 342 for this public key
20
-
21
- ```
22
10
 
23
11
 
24
12
 
@@ -28,111 +16,73 @@
28
16
 
29
17
  ```c++
30
18
 
31
- int main(int argc, char** argv)
19
+ int main(int argc, char* argv[])
32
20
 
33
21
  {
34
22
 
35
- AutoSeededRandomPool rnd;
23
+ std::string recovered;
36
-
37
-
38
-
39
- string privateKey = "rsa-private.key";
40
-
41
- string publicKey = "rsa-public.key";
42
-
43
-
44
24
 
45
25
  try
46
26
 
47
27
  {
48
28
 
49
- RSA::PrivateKey k1;
29
+ CBC_Mode< AES >::Decryption d;
50
30
 
51
- DecodePrivateKey(privateKey, k1);
31
+ d.SetKeyWithIV(key, key.size(), iv);
52
32
 
53
33
 
54
34
 
55
- RSA::PublicKey k2;
56
-
57
- DecodePublicKey(publicKey, k2);
35
+ StringSource s("encode_file.txt", true, new StreamTransformationFilter(d, new StringSink(recovered)));
58
36
 
59
37
 
60
38
 
61
- if (!k1.Validate(rnd, 3))
39
+ std::ofstream writing_file;
62
40
 
63
- throw runtime_error("Rsa private key validation failed");
41
+ writing_file.open("decode_file.txt", std::ios::out);
64
42
 
43
+ std::string writing_text = recovered;
65
44
 
45
+ writing_file << writing_text << std::endl;
66
46
 
67
- if (!k2.Validate(rnd, 3))
68
-
69
- throw runtime_error("Rsa public key validation failed");
70
-
71
-
72
-
73
- if (k1.GetModulus() != k2.GetModulus() ||
74
-
75
- k1.GetPublicExponent() != k2.GetPublicExponent())
76
-
77
- {
78
-
79
- throw runtime_error("key data did not round trip");
80
-
81
- }
82
-
83
-
84
-
85
- ///////////////////////////////////////////////////////////////////////////////////
86
-
87
-
88
-
89
- std::string cipher, tmpstr, str;
90
-
91
- tmpstr = "encode_file.txt";
92
-
93
- std::ifstream ifs(tmpstr);
94
-
95
- while (getline(ifs, str))
96
-
97
- {
98
-
99
- cipher += str;
100
-
101
- }
102
-
103
- ifs.close();
47
+ writing_file.close();
104
-
105
-
106
-
107
- // Decryption
108
-
109
- RSAES_OAEP_SHA_Decryptor d(k1);
110
-
111
-
112
-
113
- const char *recovered = "decode_file.txt";
114
-
115
- StringSource ss2(cipher, true, new PK_DecryptorFilter(rnd, d, new FileSink(recovered)));
116
48
 
117
49
  }
118
50
 
119
-
120
-
121
- catch (CryptoPP::Exception& e)
51
+ catch (const Exception& e)
122
52
 
123
53
  {
124
54
 
125
- cerr << e.what() << endl;
55
+ std::cerr << e.what() << std::endl;
126
56
 
127
- return -1;
57
+ exit(1);
128
58
 
129
59
  }
130
-
131
-
132
60
 
133
61
  return 0;
134
62
 
135
63
  }
64
+
65
+ ```
66
+
67
+
68
+
69
+ ### 試したこと
70
+
71
+ charにしてみたけど、うまくいきませんでした。
72
+
73
+ ```
74
+
75
+   string str;
76
+
77
+ const char *tmpkey = "key.key";
78
+
79
+ std::ifstream ifs(tmpkey);
80
+
81
+ ifs >> str;
82
+
83
+ const char* key = str.c_str();
84
+
85
+ ifs.close();
136
86
 
137
87
  ```
138
88
 

3

質問内容変更

2021/11/11 15:26

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- RSA号化に失敗する
1
+ RSA号化に失敗する
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Crypto++のライブラリを使ってます。
6
6
 
7
- 下記コードで号化するとエラーが発生します。原因と対策方法を教えてください。
7
+ 下記コードで号化するとエラーが発生します。原因と対策方法を教えてください。
8
8
 
9
9
  必要な情報があれば追記します。よろしくお願いします。
10
10
 
@@ -36,43 +36,67 @@
36
36
 
37
37
 
38
38
 
39
+ string privateKey = "rsa-private.key";
40
+
41
+ string publicKey = "rsa-public.key";
42
+
43
+
44
+
39
45
  try
40
46
 
41
47
  {
42
48
 
43
- RSA::PrivateKey rsaPrivate;
49
+ RSA::PrivateKey k1;
44
50
 
45
- rsaPrivate.GenerateRandomWithKeySize(rnd, 3072);
51
+ DecodePrivateKey(privateKey, k1);
46
52
 
47
53
 
48
54
 
55
+ RSA::PublicKey k2;
56
+
49
- RSA::PublicKey rsaPublic(rsaPrivate);
57
+ DecodePublicKey(publicKey, k2);
50
58
 
51
59
 
52
60
 
53
- string privateKey = "rsa-private.key";
61
+ if (!k1.Validate(rnd, 3))
54
62
 
55
- string publicKey = "rsa-public.key";
63
+ throw runtime_error("Rsa private key validation failed");
56
64
 
57
65
 
58
66
 
59
- EncodePrivateKey(privateKey, rsaPrivate);
67
+ if (!k2.Validate(rnd, 3))
60
68
 
69
+ throw runtime_error("Rsa public key validation failed");
70
+
71
+
72
+
73
+ if (k1.GetModulus() != k2.GetModulus() ||
74
+
61
- EncodePublicKey(publicKey, rsaPublic);
75
+ k1.GetPublicExponent() != k2.GetPublicExponent())
76
+
77
+ {
78
+
79
+ throw runtime_error("key data did not round trip");
80
+
81
+ }
82
+
83
+
84
+
85
+ ///////////////////////////////////////////////////////////////////////////////////
62
86
 
63
87
 
64
88
 
65
- std::string reading_text, plain, cipher, str;
89
+ std::string cipher, tmpstr, str;
66
90
 
67
- plain = "plain.txt";
91
+ tmpstr = "encode_file.txt";
68
92
 
69
- std::ifstream ifs(plain);
93
+ std::ifstream ifs(tmpstr);
70
94
 
71
95
  while (getline(ifs, str))
72
96
 
73
97
  {
74
98
 
75
- reading_text += str + "\n";
99
+ cipher += str;
76
100
 
77
101
  }
78
102
 
@@ -80,37 +104,19 @@
80
104
 
81
105
 
82
106
 
83
- // Encryption
107
+ // Decryption
84
108
 
85
- RSAES_OAEP_SHA_Encryptor e(rsaPublic);
109
+ RSAES_OAEP_SHA_Decryptor d(k1);
86
110
 
87
111
 
88
112
 
89
- StringSource ss1(reading_text, true,
113
+ const char *recovered = "decode_file.txt";
90
114
 
91
- new PK_EncryptorFilter(rnd, e,
115
+ StringSource ss2(cipher, true, new PK_DecryptorFilter(rnd, d, new FileSink(recovered)));
92
116
 
93
- new StringSink(cipher)
117
+ }
94
-
95
- ) // PK_EncryptorFilter
96
-
97
- ); // StringSource
98
118
 
99
119
 
100
-
101
- std::ofstream writing_file;
102
-
103
- std::string encfile = "encode_file.txt";
104
-
105
- writing_file.open(encfile, std::ios::out);
106
-
107
- std::string writing_text = cipher;
108
-
109
- writing_file << writing_text << std::endl;
110
-
111
- writing_file.close();
112
-
113
- }
114
120
 
115
121
  catch (CryptoPP::Exception& e)
116
122
 
@@ -121,6 +127,8 @@
121
127
  return -1;
122
128
 
123
129
  }
130
+
131
+
124
132
 
125
133
  return 0;
126
134
 

2

文章修正

2021/11/11 07:55

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- AESのキーと初期ベクトルの戻し方
1
+ RSA暗号化に失敗する
test CHANGED
@@ -4,9 +4,21 @@
4
4
 
5
5
  Crypto++のライブラリを使ってます。
6
6
 
7
- ファイルをAESで暗号化した時にキと初期ベクトルをテキストファイルに保存しました
7
+ 下記コードで暗号化するとエラが発生しま原因と対策方法を教えてください。
8
8
 
9
+ 必要な情報があれば追記します。よろしくお願いします。
10
+
11
+
12
+
13
+ ### 発生している問題・エラーメッセージ
14
+
15
+
16
+
17
+ ```
18
+
9
- 復号する時にそのキーと初期ベクトルをテキストファイルから呼び出して、keyとivに再びセットするにはどうすればいいですか?SecByteBlock key()の引数に戻すのですか?初心者なのでどうぞご教示ください。必要な情報があれば追記します。よろしくお願いします。
19
+ RSA/OAEP-MGF1(SHA-1): message length of 1139 exceeds the maximum of 342 for this public key
20
+
21
+ ```
10
22
 
11
23
 
12
24
 
@@ -16,77 +28,97 @@
16
28
 
17
29
  ```c++
18
30
 
19
- int main(int argc, char* argv[])
31
+ int main(int argc, char** argv)
20
32
 
21
33
  {
22
34
 
23
- //AutoSeededRandomPool prng;
35
+ AutoSeededRandomPool rnd;
24
-
25
- //HexEncoder encoder(new FileSink(std::cout));
26
36
 
27
37
 
28
38
 
29
- //SecByteBlock key(AES::DEFAULT_KEYLENGTH);
39
+ try
30
40
 
41
+ {
42
+
43
+ RSA::PrivateKey rsaPrivate;
44
+
31
- //SecByteBlock iv(AES::BLOCKSIZE);
45
+ rsaPrivate.GenerateRandomWithKeySize(rnd, 3072);
32
46
 
33
47
 
34
48
 
35
-   //prng.GenerateBlock(key, key.size());
36
-
37
- //prng.GenerateBlock(iv, iv.size());
49
+ RSA::PublicKey rsaPublic(rsaPrivate);
38
50
 
39
51
 
40
52
 
41
- std::string str;
53
+ string privateKey = "rsa-private.key";
42
54
 
43
- std::string pkey = "key.txt";
55
+ string publicKey = "rsa-public.key";
44
56
 
45
- std::ifstream ifs(pkey);
46
57
 
47
- while (getline(ifs, str))
48
58
 
59
+ EncodePrivateKey(privateKey, rsaPrivate);
60
+
49
- {
61
+ EncodePublicKey(publicKey, rsaPublic);
50
62
 
51
63
 
52
64
 
53
- }
65
+ std::string reading_text, plain, cipher, str;
54
66
 
67
+ plain = "plain.txt";
68
+
69
+ std::ifstream ifs(plain);
70
+
71
+ while (getline(ifs, str))
72
+
73
+ {
74
+
75
+ reading_text += str + "\n";
76
+
77
+ }
78
+
55
- ifs_key.close();
79
+ ifs.close();
56
80
 
57
81
 
58
82
 
83
+ // Encryption
84
+
59
- std::string cipher, recovered;
85
+ RSAES_OAEP_SHA_Encryptor e(rsaPublic);
60
86
 
61
87
 
62
88
 
63
- CBC_Mode< AES >::Decryption d;
89
+ StringSource ss1(reading_text, true,
64
90
 
65
- d.SetKeyWithIV(key, key.size(), iv);
91
+ new PK_EncryptorFilter(rnd, e,
66
92
 
93
+ new StringSink(cipher)
67
94
 
95
+ ) // PK_EncryptorFilter
68
96
 
69
- StringSource s("encode_file.txt", true,
70
-
71
- new StreamTransformationFilter(d,
97
+ ); // StringSource
72
-
73
- new StringSink(recovered)
74
-
75
- )
76
-
77
- );
78
98
 
79
99
 
80
100
 
81
101
  std::ofstream writing_file;
82
102
 
83
- writing_file.open("decode_file.txt", std::ios::out);
103
+ std::string encfile = "encode_file.txt";
84
104
 
105
+ writing_file.open(encfile, std::ios::out);
106
+
85
- std::string writing_text = recovered;
107
+ std::string writing_text = cipher;
86
108
 
87
109
  writing_file << writing_text << std::endl;
88
110
 
89
111
  writing_file.close();
112
+
113
+ }
114
+
115
+ catch (CryptoPP::Exception& e)
116
+
117
+ {
118
+
119
+ cerr << e.what() << endl;
120
+
121
+ return -1;
90
122
 
91
123
  }
92
124
 

1

質問修正

2021/11/11 03:18

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ファイルをAESで暗号化した時にキーと初期ベクトルをテキストファイルに保存しました。
8
8
 
9
- 復号する時にそのキーと初期ベクトルを呼び出して、keyとivにセットしたですが、どように戻したらいいのかわかりません。初心者なのでどうぞご教示ください。必要な情報があれば追記します。
9
+ 復号する時にそのキーと初期ベクトルをテキストファイルから呼び出して、keyとivに再びセットするにはどうすればですか?SecByteBlock key()引数に戻です初心者なのでどうぞご教示ください。必要な情報があれば追記します。よろしくお願いします。
10
10
 
11
11
 
12
12
 
@@ -42,9 +42,9 @@
42
42
 
43
43
  std::string pkey = "key.txt";
44
44
 
45
- std::ifstream ifs_key(pkey);
45
+ std::ifstream ifs(pkey);
46
46
 
47
- while (getline(ifs_key, str))
47
+ while (getline(ifs, str))
48
48
 
49
49
  {
50
50