亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4148 | 回復(fù): 9
打印 上一主題 下一主題

(問題解決,謝謝大家)寫進去跟讀出來的內(nèi)容不一樣了,大家?guī)臀铱纯?/a> [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-01-08 18:46 |只看該作者 |倒序瀏覽
本帖最后由 liukunmeister 于 2011-01-09 16:17 編輯

請大家看看我遇到的最新問題,我在openssl的簽名的demo代碼中做了一個測試,其實就反應(yīng)了我現(xiàn)在遇到的問題

#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>

int main ()
{
  int err;
  int sig_len;
  unsigned char sig_buf [4096];
  static char certfile[] = "cert.pem";
  static char keyfile[]  = "key.pem";
  static char data[]     = "I owe you...";
  EVP_MD_CTX     md_ctx;
  EVP_PKEY *      pkey;
  FILE *          fp;
  X509 *        x509;

  /* Just load the crypto library error strings,
   * SSL_load_error_strings() loads the crypto AND the SSL ones */
  /* SSL_load_error_strings();*/
  ERR_load_crypto_strings();
  
  /* Read private key */
  
  fp = fopen (keyfile, "r");
  if (fp == NULL) exit (1);
  pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
  fclose (fp);

  if (pkey == NULL) {
        ERR_print_errors_fp (stderr);
        exit (1);
  }
  
  /* Do the signature */
  
  EVP_SignInit   (&md_ctx, EVP_sha1());
  EVP_SignUpdate (&md_ctx, data, strlen(data));
  sig_len = sizeof(sig_buf);
  err = EVP_SignFinal (&md_ctx, sig_buf, &sig_len, pkey);

  if (err != 1) {
        ERR_print_errors_fp(stderr);
        exit (1);
  }

  EVP_PKEY_free (pkey);
注意,問題從這里開始,我把用于保存簽名的數(shù)組sig_buf以二進制文件操作的形式寫到了test_sig文件中,我就按照數(shù)組長度4096全寫進去了
  fp=fopen("/home/administrator/test_sig","w");
  if(fwrite(sig_buf,sizeof(unsigned char),4096,fp)!=4096)
  {
          printf("fwrite error\n");
          exit(1);
  }
  fclose(fp);
在這里,問題出現(xiàn)了
然而,當(dāng)我重新定義了一個和sig_buf一樣長度的數(shù)組,讀取同樣長度的內(nèi)容也就是4096, 再往下執(zhí)行的時候,就會報錯,說簽名長度有問題.補充一下,如果我還是用sig_buf而不是sigData從test_sig中把保存進去的內(nèi)容讀出來,就又是正確的。

  unsigned char sigData[4096];
  fp=fopen("/home/administrator/test_sig","r");
  if(fread(sigData,sizeof(unsigned char),4096,fp)!=4096)
  {
          printf("fread error\n");
          exit(1);
  }
  fclose(fp);
  
  
  /* Read public key */
  
  fp = fopen (certfile, "r");
  if (fp == NULL) exit (1);
  x509 = PEM_read_X509(fp, NULL, NULL, NULL);
  fclose (fp);

  if (x509 == NULL) {
        ERR_print_errors_fp (stderr);
        exit (1);
  }
  
  /* Get public key - eay */
  pkey=X509_get_pubkey(x509);
  if (pkey == NULL) {
        ERR_print_errors_fp (stderr);
        exit (1);
  }

  /* Verify the signature */
  
  EVP_VerifyInit   (&md_ctx, EVP_sha1());
  EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data));
  err = EVP_VerifyFinal (&md_ctx, sigData, sizeof(sigData), pkey); //這里我也都把以前的sig_buf改為了sigData
  EVP_PKEY_free (pkey);

  if (err != 1) {
        ERR_print_errors_fp (stderr);
        exit (1);
  }
  printf ("Signature Verified Ok.\n");
  return(0);
}
難道簽名還記錄數(shù)組名字?明明一樣的數(shù)組,sig_buf行,sigData怎么就不行了?

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
2 [報告]
發(fā)表于 2011-01-08 19:22 |只看該作者
結(jié)果不要當(dāng)作字符串處理,中間有0的,截斷了

論壇徽章:
0
3 [報告]
發(fā)表于 2011-01-08 19:31 |只看該作者
結(jié)果不要當(dāng)作字符串處理,中間有0的,截斷了
hellioncu 發(fā)表于 2011-01-08 19:22


不當(dāng)字符串處理,我怎么來處理呢?

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
4 [報告]
發(fā)表于 2011-01-08 20:20 |只看該作者
不用fgets,strcat,用fread,memcpy之類的

論壇徽章:
0
5 [報告]
發(fā)表于 2011-01-08 20:49 |只看該作者
不用fgets,strcat,用fread,memcpy之類的
hellioncu 發(fā)表于 2011-01-08 20:20


關(guān)鍵是我也不知道這個簽名有多長,我很好奇,如果openssl的庫函數(shù)不是通過'\0'空字符來判斷結(jié)尾的,那它是怎么來判斷這個簽名長度的?

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
6 [報告]
發(fā)表于 2011-01-08 20:59 |只看該作者
關(guān)鍵是我也不知道這個簽名有多長,我很好奇,如果openssl的庫函數(shù)不是通過'\0'空字符來判斷結(jié)尾的,那它 ...
liukunmeister 發(fā)表于 2011-01-08 20:49



    簽名結(jié)果是定長的,算法決定

論壇徽章:
0
7 [報告]
發(fā)表于 2011-01-08 23:44 |只看該作者
RSA_sign,RSA_public_encrypt, RSA_private_encrypt之類的東西不是會返回簽名長度么,仔細看看manual呢?雖然它的文檔確實很糟糕……

論壇徽章:
0
8 [報告]
發(fā)表于 2011-01-09 02:32 |只看該作者
openssl有簽名的例子 另外網(wǎng)上也有簽名的例程 另外使用最新版的openssl 該釋放的都要釋放 否則可能引起 內(nèi)存洩露問題

論壇徽章:
0
9 [報告]
發(fā)表于 2011-01-09 08:53 |只看該作者

  1. #include <stdio.h>
  2. #include <openssl/rsa.h>
  3. #include <openssl/evp.h>
  4. #include <openssl/objects.h>
  5. #include <openssl/x509.h>
  6. #include <openssl/err.h>
  7. #include <openssl/pem.h>
  8. #include <openssl/ssl.h>

  9. int main ()
  10. {
  11.   int err;
  12.   int sig_len;
  13.   unsigned char sig_buf [4096];
  14.   static char certfile[] = "cert.pem";
  15.   static char keyfile[]  = "key.pem";
  16.   static char data[]     = "I owe you...";
  17.   EVP_MD_CTX     md_ctx;
  18.   EVP_PKEY *      pkey;
  19.   FILE *          fp;
  20.   X509 *        x509;
  21.   int i;

  22.   /* Just load the crypto library error strings,
  23.    * SSL_load_error_strings() loads the crypto AND the SSL ones */
  24.   /* SSL_load_error_strings();*/
  25.   ERR_load_crypto_strings();
  26.   
  27.   /* Read private key */
  28.   
  29.   fp = fopen (keyfile, "r");
  30.   if (fp == NULL) exit (1);
  31.   pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
  32.   fclose (fp);

  33.   if (pkey == NULL) {
  34.         ERR_print_errors_fp (stderr);
  35.         exit (1);
  36.   }
  37.   
  38.   /* Do the signature */

  39.   memset(sig_buf,0,sizeof(sig_buf));



  40.   //EVP_SignInit   (&md_ctx, EVP_sha1());
  41.   EVP_SignInit   (&md_ctx, EVP_sha256());
  42.   EVP_SignUpdate (&md_ctx, data, strlen(data));
  43.   sig_len = sizeof(sig_buf);
  44.   err = EVP_SignFinal (&md_ctx, sig_buf, &sig_len, pkey);

  45.   if (err != 1) {
  46.         ERR_print_errors_fp(stderr);
  47.         exit (1);
  48.   }

  49.   EVP_PKEY_free (pkey);

  50.   for(i=0;i< sig_len;i++)
  51.         printf("%02X",sig_buf[i]);

  52.   
  53.   /* Read public key */
  54.   
  55.   fp = fopen (certfile, "r");
  56.   if (fp == NULL) exit (1);
  57.   x509 = PEM_read_X509(fp, NULL, NULL, NULL);
  58.   fclose (fp);

  59.   if (x509 == NULL) {
  60.         ERR_print_errors_fp (stderr);
  61.         exit (1);
  62.   }
  63.   
  64.   /* Get public key - eay */
  65.   pkey=X509_get_pubkey(x509);
  66.   if (pkey == NULL) {
  67.         ERR_print_errors_fp (stderr);
  68.         exit (1);
  69.   }

  70.   /* Verify the signature */
  71.   
  72.   //EVP_VerifyInit   (&md_ctx, EVP_sha1());
  73.   EVP_VerifyInit   (&md_ctx, EVP_sha256());
  74.   EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data));
  75.   err = EVP_VerifyFinal (&md_ctx, sig_buf, sig_len, pkey);
  76.   EVP_PKEY_free (pkey);

  77.   if (err != 1) {
  78.         ERR_print_errors_fp (stderr);
  79.         exit (1);
  80.   }
  81.   printf ("\nSignature Verified Ok.\n");
  82.   return(0);
  83. }
復(fù)制代碼

論壇徽章:
0
10 [報告]
發(fā)表于 2011-01-09 10:49 |只看該作者
wenlq 發(fā)表于 2011-01-09 08:53


我其實用的就是這個例子,但是它是直接用庫函數(shù),拿數(shù)組就驗證了,但是我要把數(shù)組里的簽名寫到文件里保存,然后再從文件讀出來驗證,其實就是把這個程序分成了兩部分,一部分簽名,一部分驗證,中間加上讀寫文件操作,而也恰恰就是讀寫文件操作出問題了。。。。。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP