4

この問題は私を夢中にさせています!:) 公開鍵と秘密鍵のペアをいくつか生成していますが、秘密鍵をロードしようとするとエラーが発生します。私はCを使用しています。キーにパスワード「password」を使用していることに注意してください。これは#defineとして設定されていますが、手動で文字列として入力しようとしましたが、違いはありません。キーを生成する方法は次のとおりです。

FILE *fp;
OpenSSL_add_all_algorithms();
RSA *rsa=NULL;
unsigned char seed[KEYSIZE];
int i;

//Seed PRNG
srand(time(NULL));
RAND_bytes(seed, KEYSIZE - 1);

//Generate a key
if ((rsa=RSA_generate_key(KEYSIZE,65537,NULL,NULL)) == NULL) ERR_get_error();

//Write the public key
fp = fopen(pubkey,"w");
if (!PEM_write_RSA_PUBKEY(fp, rsa)) {
    printf("Error writing public key\n"); exit(1);
}
fclose(fp);

//Write the private key
fp = fopen(privkey,"w");
if (!PEM_write_RSAPrivateKey(fp, rsa, EVP_des_ede3_cbc(), NULL, 0, NULL, PASSWORD))
{
   printf("Error writing private key\n"); exit(1);
}
fclose(fp);

これは正常に完了し、適切な場所にファイルが配置され、見栄えがよくなります。これらのファイルを使用してコマンドラインで暗号化/復号化にも成功したので、それらが機能することがわかりました!

秘密鍵をロードする方法は次のとおりです。

static void decrypt(int locale) {
FILE *key; 
RSA *rsa;

key = fopen(PRIVATEKEY, "r");
if (key == NULL) perror("Error reading private key");

rsa = PEM_read_RSAPrivateKey(key, NULL, NULL, PASSWORD); // THIS BREAKS!
if (rsa == NULL) perror("Private Key not valid");  // I always get this error :(

if (rsa != NULL) RSA_free(rsa);
fclose(key);}

助言がありますか?ソース ファイル rsa.c を確認しましたが、これは基本的に、fread の代わりに BIO を使用することを除いて、そこで行う方法とまったく同じです。なぜ私のやり方がうまくいかないのかわかりません!

strace出力の関連セクションは次のとおりです。

open("/opt/evoting/keys/priv/mix1.priv", O_RDONLY) = 15
fstat64(15, {st_mode=S_IFREG|0644, st_size=1751, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb773c000
read(15, "-----BEGIN RSA PRIVATE KEY-----\n"..., 4096) = 1751
dup(2)                                  = 16
fcntl64(16, F_GETFL)                    = 0x2 (flags O_RDWR)
fstat64(16, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb773b000
_llseek(16, 0, 0xbfba00d0, SEEK_CUR)    = -1 ESPIPE (Illegal seek)
write(16, "Private Key not valid: Resource "..., 56Private Key not valid: Resource     temporarily unavailable ) = 56
close(16)                               = 0
munmap(0xb773b000, 4096)                = 0
close(15)                               = 0
munmap(0xb773c000, 4096)                = 0

また、perror は「リソースが利用できません」というエラーを生成します。それが何なのかはわかりませんが、ハードとソフトの ulimits を非常に高くリセットしましたが、何も起こりませんでした。関数を独自のファイルにコピーしてコンパイルしましたが、そこでエラーは発生しません(ただし、キーの読み取りにはまだ失敗します)。

4

2 に答える 2

8

あはは!わかりました、私はこの問題のトラブルシューティングについて多くのことを学びました. 私の情報のほとんどはこのスレッドから来ました: http://readlist.com/lists/openssl.org/openssl-users/2/10340.html

基本的に私は使用せずperror、代わりに使用する必要がありましERR_print_errors_fp(stderr)た。これにより、次のような実際のエラーメッセージが表示されました。

3077973640:error:0906B072:lib(9):func(107):reason(114):pem_lib.c:530:

次に、コマンドを使用しました:openssl errstr 0906B072そして得た:

error:0906B072:PEM routines:PEM_get_EVP_CIPHER_INFO:unsupported encryption

基本的に、RSAでサポートされていないCBC:EVP_des_ede3_cbc()を指定したキーペアの作成に戻りました。では、どうぞ!

于 2012-10-14T20:36:12.860 に答える