NSString *RSA_EVP_Sign(NSString *data)
{
unsigned char *Str=(unsigned char *)[data UTF8String];//utf8編碼轉換成c的字符串
EVP_PKEY *prikey;
NSString *private = formatPrivate(PRIVATE_KEY);//格式化自己的私鑰
NSData *pri= [private dataUsingEncoding: NSUTF8StringEncoding];//utf8編碼將私鑰轉換成二進制
BIO *bio = BIO_new_mem_buf((void *)[pri bytes], (int)[pri length]);//將私鑰讀取到內存中
prikey = PEM_read_bio_PrivateKey(bio, NULL,NULL, NULL);//讀內存中的私鑰
BIO_free(bio);
int strLen= (int)strlen((const char *)Str);
EVP_MD_CTX mdctx;
EVP_MD_CTX_init(&mdctx); //初始化mdctx結構體
if(!EVP_SignInit_ex(&mdctx, EVP_sha256(), NULL)) //初始化數據加密,把加密得到的數據放入mdctx
{
printf("error\n");
EVP_PKEY_free(prikey);
}
if(!EVP_SignUpdate(&mdctx, Str, strLen)) //開始加密
{
printf("error\n");
EVP_PKEY_free(prikey);
}
unsigned int signLen=EVP_PKEY_size(prikey);
unsigned char* signBuf=(unsigned char *)calloc(signLen+1, sizeof(unsigned char)); //申請signLen+1段內存
if(!EVP_SignFinal(&mdctx, signBuf, &signLen, prikey)) //數據拷貝到signBuf中
{
printf("error\n");
EVP_PKEY_free(prikey);
}
EVP_MD_CTX_cleanup(&mdctx); //清空防止內存泄漏
NSMutableString *result = [NSMutableString stringWithCapacity:128];
for(int i = 0; i < 128; i++)
[result appendFormat:@"%02x", signBuf[i]]; //將signBuf中的數據加入到result中去
return result;
}
利用openssl進行RSA簽名
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.