gcry_mpi_t 内の公開鍵をビット列で取り出したい
libgcrypt1.7.6 を使ってRSA暗号をいじってく中で,
gcry_mpi_t型におさまっている公開鍵をビット列で取り出したいです.
(libgcrypt1.7.6を対象とするテスト用なのでこのバージョンで実行したいです)
char型の鍵をgcry_mpi_t型に入れることはできるんですが,その逆がうまくいきません.
つまりgcry_mpi_t型の公開鍵eをchar型にして取り出すとなぜか文字列が変わります.
###発生している問題・エラーメッセージ
公開鍵eについてサンプル値「0x010001」を使って,一度gcry_mpi_t型に変えた後.
再びchar型として取り出すとなぜか「0x000001」に代わってしまいます.
※ちなみにchar型からgcry_mpi_t型に戻すとこれは正しく「0x010001」になってます.
###該当のソースコード
c
1#include "gcry.h" 2 3/* A sample 2048 bit RSA key used for the selftests (public only). */ 4static const char sample_public_key[] = 5" (public-key" 6" (rsa" 7" (n #009F56231A3D82E3E7D613D59D53E9AB921BEF9F08A782AED0B6E46ADBC853EC" 8" 7C71C422435A3CD8FA0DB9EFD55CD3295BADC4E8E2E2B94E15AE82866AB8ADE8" 9" 7E469FAE76DC3577DE87F1F419C4EB41123DFAF8D16922D5EDBAD6E9076D5A1C" 10" 958106F0AE5E2E9193C6B49124C64C2A241C4075D4AF16299EB87A6585BAE917" 11" DEF27FCDD165764D069BC18D16527B29DAAB549F7BBED4A7C6A842D203ED6613" 12" 6E2411744E432CD26D940132F25874483DCAEECDFD95744819CBCF1EA810681C" 13" 42907EBCB1C7EAFBE75C87EC32C5413EA10476545D3FC7B2ADB1B66B7F200918" 14" 664B0E5261C2895AA28B0DE321E921B3F877172CCCAB81F43EF98002916156F6CB#)" 15" (e #010001#)))"; 16 17 18int main(int argc, char** argv){ 19 gcry_error_t err = 0; 20 gcry_sexp_t pkey = NULL; 21 22 23 /* Covert the S-expressions into the internal representation. */ 24 err = gcry_sexp_sscan(&pkey, NULL, 25 sample_public_key, strlen(sample_public_key)); 26 if (err){ 27 xerr("failed to scan sample key."); 28 return 1; 29 } 30 31 32 /* pkey compornents */ 33 gcry_sexp_t e_pkey = gcry_sexp_find_token(pkey, "e", 0); 34 gcry_mpi_t expo_pkey = gcry_sexp_nth_mpi(e_pkey, 1, GCRYMPI_FMT_USG); 35 36 37 /*Dump MPIs */ 38 printf("### Dump MPIs ###\n"); 39 printf("pkey expo\n"); 40 gcry_mpi_dump(expo_pkey); 41 printf("\n"); 42 43 44 /* bit length */ 45 printf("### bit length ###\n"); 46 unsigned int expo_len = gcry_mpi_get_nbits(expo_pkey); 47 printf("expo_pkey :\t%d\n", expo_len); 48 49 50 /* mpi_print */ 51 printf("### mpi print command ###\n"); 52 printf("mpi_print\n"); 53 unsigned char* expo; 54 expo = (unsigned char*)malloc(3); 55 if (expo == NULL){ 56 printf("expo is NULL\n"); 57 return 1; 58 } 59 err = gcry_mpi_print(GCRYMPI_FMT_USG, expo, 3, NULL, expo_pkey); 60 if (err){ 61 xerr("failed: expo MPI_print"); 62 } 63 64 65 /* check print */ 66 gcry_mpi_t res; 67 size_t size; 68 err = gcry_mpi_scan(&res, GCRYMPI_FMT_USG, 69 expo, 3, &size); 70 if (err){ 71 xerr("failed to scan res"); 72 } 73 printf("check mpi print\n"); 74 gcry_mpi_dump(res); 75 printf("\n"); 76 // bit print 77 printf("\n"); 78 printf("### bit sequance ###\n"); 79 printf("%4u\t%02x\n", *expo, *expo); 80 for (int i = expo_len-1; i >= 0; i--){ 81 printf("%d", (*(expo)>>i) & 1); 82 if (i % 4 == 0){ 83 printf(" "); 84 } 85 } 86 printf("\n"); 87} 88
出力はこんな感じです↓↓
### Dump MPIs ### pkey expo 010001 //これが正しい鍵値 ### bit length ### expo_pkey: 17 //ビット長 ### mpi print command ### mpi_print check mpi print 010001 //char型で取り出した鍵をもう一度gcry_mpi_t型に戻してdumpしたもの ### bit sequance ### 1 01 0 0000 0000 0000 0001 // 最上位ビットが「1」のはずだがならない
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/04 11:17
2017/11/04 12:07