前面一篇講到了金鑰的格式,本文利用金鑰進行加密,加密/解密都是類似的,本文只說加密。
金鑰載入有兩個介面:
pem_read_rsa_pubkey載入pkcs#8檔案頭格式
pem_read_bio_rsapublickey載入pkcs#1檔案頭格式
引數沒仔細研究,第乙個引數為檔案控制代碼即可。
加密介面:
int rsa_public_encrypt(int flen, const unsigned char *from,
unsigned char *to, rsa *rsa, int padding);
這個介面有個坑,必須要理解ras的padding原理才能很好的使用這個介面。
這裡要理解一下rsa_pkcs1_padding,請參照:
padding有兩種,
當padding是rsa_no_padding,則from不會被填充。這種用於加密字元傳長度等於明文快最大長度的情況(1024的rsa,明文長度128)。
當padding是rsa_pkcs1_padding時,則使用pkcs1規則對from進行填充,填充的內容是隨機值,所以每次加密的結果都不同。當傳入字串長度不夠明文快最大長度時,需要使用rsa_pkcs1_padding方式,使用rsa_no_padding則會機密失敗。
檔案載入pem格式金鑰並加密
int file_key_encrypt(void )
/* 讀取公鑰pem,pubkey格式pem使用pem_read_rsa_pubkey函式 */
if ((rsa = pem_read_rsa_pubkey(fp, null, null, null)) == null)
rsa_print_fp(stdout, rsa, 0);
len = strlen(str);
rsa_len = rsa_size(rsa);
ret=rsa_public_encrypt(rsa_len, (unsigned char *)str, (unsigned char*)en, rsa, rsa_no_padding);
if(ret < 0)
printf("en\n");
if(ret > 0)
printf("\n");
} rsa_free(rsa);
fclose(fp);
return ret;
}
記憶體載入pem格式金鑰並進行加密
int mem_key_encrypt()
rsa* rsa = pem_read_bio_rsa_pubkey(in, null, null, null);
if (rsa == null)
#ifdef debug
//rsa_print_fp(stdout, rsa, 0);
#endif
int keysize = rsa_size(rsa);
char fdata[256];
memset(fdata,0,256);
memcpy(fdata,"12345678",8);
char tdata[512];
memset(tdata,0,512);
int flen = strlen(fdata);
//flen = 15
printf("rsa_public_encrypt:\n");
int ret = rsa_public_encrypt(256, (unsigned char *)fdata, (unsigned char *)tdata, rsa, rsa_no_padding);
//ret = 128
printf("rsa_public_encrypt ret=%d\n",ret);
if(ret > 0)
printf("\n");
} bio_free(in);
rsa_free(rsa);
}
以上**在ubuntu20.4上編譯通過 openssl rsa加解密例程
openssl是可以很方便加密解密的庫,可以使用它來對需要在網路中傳輸的資料加密。可以使用非對稱加密 公鑰加密,私鑰解密。openssl提供了對rsa的支援,但rsa存在計算效率低的問題,所以一般的做法是使用對稱金鑰加密資料,然後再把這個只在當前有效的臨時生成的對稱金鑰用非對稱金鑰的公鑰加密之後傳遞...
openssl rsa 命令列 用法
openssl工具的簡單使用 生成乙個金鑰 openssl genrsa out test.key 1024 這裡 out指定生成檔案的。需要注意的是這個檔案包含了 公鑰和金鑰兩部分 也就是說這個檔案即可用來加密也可以用來解密。後面的1024是生成金鑰的長度。openssl可以將這個檔案中的公鑰提取...
openssl rsa公鑰驗簽名
場景 只有公鑰字串 base64編碼 需驗證簽名。環境 c openssl step1 從記憶體讀取公鑰 cpp view plain copy static rsa getpublickeyrsa string strpublickey i strpublickey.insert 0,begin ...