當前位置:首頁 » 密碼管理 » opensslrsa加密演算法

opensslrsa加密演算法

發布時間: 2023-04-14 21:29:11

① 如何利用OpenSSL庫進行RSA加密和解密

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/engine.h>

intmain(intargc,char*argv[])
{
printf("openssl_testbegin ");
RSA*rsa=NULL;
charoriginstr[]="hello ";//這是我們需要加密的原始數據
//allocateRSAstructure,首先需要申請一個RSA結構題用於存放生成的公私鑰,這里rsa就是這個結構體的指針
rsa=RSA_new();
if(rsa==NULL)
{
printf("RSA_newfailed ");
return-1;
}

//generateRSAkeys
BIGNUM*exponent;
exponent=BN_new();//生成RSA公私鑰之前需要選擇一個奇數(oddnumber)來用於生成公私鑰
if(exponent==NULL)
{
printf("BN_newfailed ");
gotoFAIL1;
}
if(0==BN_set_word(exponent,65537))//這里選擇奇數65537
{
printf("BN_set_wordfailed ");
gotoFAIL1;
}


//這里molus的長度選擇4096,小於1024的molus長度都是不安全的,容易被破解
if(0==RSA_generate_key_ex(rsa,4096,exponent,NULL))
{
printf("RSA_generate_key_exfailed ");
gotoFAIL;
}
char*cipherstr=NULL;
//分配一段空間用於存儲加密後的數據,這個空間的大小由RSA_size函數根據rsa算出
cipherstr=malloc(RSA_size(rsa));
if(cipherstr==NULL)
{
printf("malloccipherstrbuffailed ");
gotoFAIL1;
}
//下面是實際的加密過程,最後一個參數paddingtype,有以下幾種。
/*
RSA_PKCS1_PADDINGPKCS#1v1.5padding..
RSA_PKCS1_OAEP_PADDING
EME-OAEPasdefinedinPKCS#1v2.0withSHA-1,..
RSA_SSLV23_PADDING
PKCS#1v1.5paddingwithanSSL-.
RSA_NO_PADDING
RawRSAencryption.ntheapplicationcode..
*/
//這里首先用公鑰進行加密,選擇了RSA_PKCS1_PADDING

if(RSA_size(rsa)!=RSA_public_encrypt(strlen(originstr)+1,originstr,cipherstr,rsa,RSA_PKCS1_PADDING))
{
printf("encryptionfailure ");
gotoFAIL2;
}
printf("theoriginalstringis%s ",originstr);
printf("theencryptedstringis%s ",cipherstr);


//Now,let'
//下面來用私鑰解密,首先需要一個buffer用於存儲解密後的數據,這個buffer的長度要足夠(小於RSA_size(rsa))
//這里分配一個長度為250的字元數組,應該是夠用的。
chardecrypted_str[250];
intdecrypted_len;
if(-1=(decrypted_len=RSA_private_decrypt(256,cipherstr,decrypted_str,rsa,RSA_PKCS1_PADDING)))
{
printf("decryptionfailure ");
gotoFAIL2;
}
printf("decryptedstringlengthis%d,decryped_stris%s ",decrypted_len,decrypted_str);
FAIL2:
free(cipherstr);
FAIL1:
BN_free(exponent);
FAIL:
RSA_free(rsa);
return0;
}

以上是源代碼,下面使用下面的編譯命令在源碼所在路徑下生成可執行文件
gcc *.c -o openssl_test -lcrypto -ldl -L/usr/local/ssl/lib -I/usr/local/ssl/include
其中,-lcrypto和-ldl是必須的,前者是OpenSSL中的加密演算法庫,後者是用於成功載入動態庫。

② IOS中怎麼做RSA加密演算法

RSA加密以及解密實現步驟:

1、使用openssl生成密匙對。

代碼如下:(代碼源於github開源社區)

#!/usr/bin/envbash
echo"GeneratingRSAkeypair..."
echo"1024RSAkey:private_key.pem"
opensslgenrsa-outprivate_key.pem1024

echo":rsaCertReq.csr"
opensslreq-new-keyprivate_key.pem-outrsaCertReq.csr

echo"createcertificationusingx509:rsaCert.crt"
opensslx509-req-days3650-inrsaCertReq.csr-signkeyprivate_key.pem-outrsaCert.crt

echo"createpublic_key.derForIOS"
opensslx509-outformder-inrsaCert.crt-outpublic_key.der

echo"createprivate_key.p12ForIOS.Pleaserememberyourpassword.ThepasswordwillbeusediniOS."
opensslpkcs12-export-outprivate_key.p12-inkeyprivate_key.pem-inrsaCert.crt

echo"creatersa_public_key.pemForJava"
opensslrsa-inprivate_key.pem-outrsa_public_key.pem-pubout
echo"createpkcs8_private_key.pemForJava"
opensslpkcs8-topk8-inprivate_key.pem-outpkcs8_private_key.pem-nocrypt

echo"finished."

2、載入證書後即可進行加密演算法。

代碼:

RSAEncryptor*rsa=[[RSAEncryptoralloc]init];

NSLog(@"encryptorusingrsa");
NSString*publicKeyPath=[[NSBundlemainBundle]pathForResource:@"public_key"ofType:@"der"];
NSLog(@"publickey:%@",publicKeyPath);
[rsaloadPublicKeyFromFile:publicKeyPath];

NSString*securityText=@"hello~";
NSString*encryptedString=[rsarsaEncryptString:securityText];
NSLog(@"encrypteddata:%@",encryptedString);

對應解密代碼:

NSLog(@"decryptorusingrsa");
[rsaloadPrivateKeyFromFile:[[NSBundlemainBundle]pathForResource:@"private_key"ofType:@"p12"]password:@"123456"];
NSString*decryptedString=[rsarsaDecryptString:encryptedString];
NSLog(@"decrypteddata:%@",decryptedString);

RSA基本原理:

RSA使用"秘匙對"對數據進行加密解密.在加密解密數據前,需要先生成公鑰(public key)和私鑰(private key)。

公鑰(public key): 用於加密數據. 用於公開, 一般存放在數據提供方, 例如iOS客戶端。

私鑰(private key): 用於解密數據. 必須保密, 私鑰泄露會造成安全問題。

③ OpenSSL 功能介紹

1 概述

OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。

OpenSSL是實現安全套接字層(SSL v2 / v3)和傳輸層安全(TLS v1)網路協議及其所需的相關加密標準的加密工具包。

OpenSSL:開源項目

三個組件:

openssl: 多用途的命令行工具,包openssl

libcrypto: 加密演算法庫,包openssl-libs

libssl:加密模塊應用庫,實現了ssl及tls,包nss

.openssl命令:

兩種運行模式:交互模式和批處理模式

opensslversion:程序版本號

標准命令、消息摘要命令、加密命令

標准命令:enc, ca, req, ...

查看幫助:openssl ?

可以通過openssl 來創建CA和頒發證書,文章 http://ghbsunny.blog.51cto.com/7759574/1964754

有做介紹,本文僅介紹openssl這個工具包的其他常用功能

2 案例介紹

2.1 對稱加密

工具:openssl  enc, gpg,文章 http://ghbsunny.blog.51cto.com/7759574/1964887 已經介紹

演算法:3des, aes, blowfish, twofish

.enc命令:

對稱密碼命令允許使用基於密碼或明確提供的密鑰的各種塊和流密碼來加密或解密數據。 Base64編碼或解碼也可以通過本身或加密或解密來執行。

The symmetric cipher commands allow data to be encrypted or decrypted using various block and stream ciphers using keys based on passwords or explicitly provided. Base64 encoding or decoding can also be performed either by itself or in addition to the encryption or decryption.

幫助:man enc

例子

加密文件

以下命令運行需要輸入一個密碼,當解密的時候需要輸入相同的密碼才能解密,這里新生成的文件後綴名不一定是cipher,可以自己指定

openssl enc  -e -des3 -a -salt -in testfile   -out testfile.cipher

解密文件

openssl  enc   -d -des3 -a -salt –in testfile.cipher -out testfile

2.2 公鑰加密

公鑰加密生成非對稱的密鑰

演算法:RSA, ELGamal

工具:gpg, openssl  rsautl(man rsautl)

數字簽名:

演算法:RSA, DSA, ELGamal

密鑰交換:

演算法:dh

DSA: Digital Signature Algorithm

DSS:Digital Signature Standard

RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。命名是取其名字首字母組合成RSA

RSA公鑰與私鑰主要用於數字簽名(Digital Signature)與認證(Authentication),我們一般也稱之為不對稱加密/解密。

2.2.1 生成密鑰對

幫助:man genrsa

.生成私鑰,這個生成密鑰的過程要掌握

openssl genrsa  -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS

私鑰文件生成後,建議把許可權改成600,保護,放在被其他人查看密碼信息

私鑰里的文件,如果被拿到,沒有通過des這關鍵字加密的話,就相當於是明文

這個命令執行的時候,要輸入八位數的密碼,當要使用這個私鑰的時候需要輸入密碼

(umask 077; openssl genrsa –out test.key  –des 2048)

括弧表示子進程,結束後,umask就會恢復未默認的值,umask的值使得其他人和組都沒有任何許可權,是為了保護生成的私鑰

2.2.2 從私鑰中提取出公鑰,導出公鑰

公鑰推不出私鑰,私鑰可以推出公鑰

openssl  rsa  -in PRIVATEKEYFILE –pubout  –out PUBLICKEYFILE

Openssl  rsa  –in test.key  –pubout  –out test.key.pub

公鑰是公開的,可以不設置許可權,以上是生成公鑰

2.2.3 公鑰加密文件

openssl rsautl -encrypt -in input.file -inkey pubkey.pem -pubin -out output.file

-in 指定被加密的文件

-inkey 指定加密公鑰文件

-pubin 表面是用純公鑰文件加密

-out 指定加密後的文件

例子:

openssl rsautl -encrypt -in ftpback -inkey test.key.pub -pubin -out ftpssl

2.2.4 私鑰解密文件

openssl rsautl -decrypt -in input.file -inkey key.pem -out output.file

-in 指定需要解密的文件

-inkey 指定私鑰文件

-out 指定解密後的文件

例子:

openssl rsautl -decrypt -in ftpssl -inkey test.key -out  ftpdec

2.3 單向加密

單向加密即獲取摘要

工具:md5sum, sha1sum, sha224sum,sha256sum…

openssl    dgst

dgst:摘要功能輸出所提供文件的消息摘要或十六進制形式的文件。 它們也可用於數字簽名和驗證。

The digest functions output the message digest of a supplied file or files in hexadecimal form. They can also be used for digital signing and verification.

.dgst命令:

幫助:man dgst

openssl  dgst  -md5 [-hex默認]  /PATH/SOMEFILE

openssl dgst  -md5 testfile

以上命令將文件生成一個固定長度的摘要值,演算法是md5,大小佔128bite

md5sum /PATH/TO/SOMEFILE

以上這兩個md5得到的結果是一樣的

.MAC: Message Authentication Code,單向加密(hash)的一種延伸應用,用於實現網路通信中保證所傳輸數據的完整性機制

MAC 消息認證碼,構造方法可以基於hash,也可以基於對稱加密演算法,HMAC是基於hash的消息認證碼。數據和密鑰作為輸入,摘要信息作為輸出,常用於認證。

源文檔

2.4 生成用戶密碼

passwd命令:

幫助:man sslpasswd

openssl  passwd  -1 -salt SALT

-1對應的就是hash的md5演算法

SALT:這里是鹽值,人為指定,使得同一密碼生成的加密值不一樣,最多8位,超過8位沒有意義,比如前面8位一樣,後面還有幾位數不一樣,這樣生成的密碼值是一樣的

openssl  passwd  -1 –salt centos

grub-md5-crypt同樣生成md5加密的口令,centos為鹽值

比如這里的密碼我都是輸入123,但是鹽值不一樣,一個是centos,一個是centos6,生成的加密值不一樣

2.5 生成隨機數

幫助:man sslrand

rand命令在播放隨機數生成器一次後輸出num偽隨機位元組。 與其他openssl命令行工具一樣,除了-rand選項中給出的文件外,PRNG種子使用文件$ HOME / .rnd或.rnd。 如果從這些來源獲得足夠的播種,將會寫回新的$ HOME / .rnd或.rnd文件。

The rand command outputs num pseudo-random bytes after seeding the random number generator once.  As in other openssl command line tools, PRNG seeding uses the file $HOME/.rnd or .rnd in addition to the files given in the  -rand option.  A new $HOME/.rnd or .rnd file will be written back if enough seeding was obtained from these   sources.

openssl  rand -base64|-hex NUM

指定數字生成隨機數,如果是-hex 後面的數值比如6,那麼生成的長度是12位,因為hex生成的隨機數是16進制組合的數,hex 後面的num是位元組數,一個16進制數佔用4位,半個位元組

base後面可以生成隨機密碼

base64 生成隨機的數,可以用任何字元,也可以把圖片保存成base64的格式,通過base64生成的圖片,可以

用base64來還原出圖片

NUM: 表示位元組數;-hex時,每個字元為十六進制,相當於4位二進制,出現的字元數為NUM*2

3 總結

openssl還有很多用法,本文僅單純介紹了其中一部分,更多用法請使用幫助 man openssl 進行查看

④ OpenSSL之RSA用法

RSA公開密鑰密碼體制是一種使用不同的加密密鑰與解密密鑰,「由已知加密密鑰推導出解密密旅遲鑰在計算上是不可行的」密碼體制 。在公開密鑰密碼體制中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。加密演算法E和解密演算法D也都是公開的。雖然解密密鑰SK是由公開密鑰PK決定的,但卻不能根據PK計算出SK 。
正是基於這種理論,1978年出現了著名的RSA演算法,它通常是先生成一對RSA密鑰,其中之一是保密密鑰,由用戶保存;另一個為公開密鑰,可對外公開,甚至可在網路伺服器中注冊。為提高保密強度,RSA密鑰至少為500位長,一般推薦使用1024位。這就使加密的計算量很大。為減少計算量,在傳送信息時,常採用傳統加密方法與公開密鑰加密方法相結合的方式,即信息採用改進的DES或IDEA對話密鑰加密,然後使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息後,用不同的密鑰解密並可核對信息摘要 。

RSA演算法是一個廣泛使用的公鑰演算法。其密鑰包括公鑰和私鑰。它能用於數字簽名、身份認證以及密鑰交換。RSA密鑰長度一般使用1024位或者更高。RSA密鑰信息主要包括:
n:模數
e:公鑰指數
d:私鑰指數
p:最初的大拆行李素數
q:最初的大素數
其中,公鑰為n和e;私鑰為n和d。

本文假設你已經安裝好了OpenSSL,並且持有一份1.1.1的源碼。
RSA相關的頭文件在rsa.h中、源文件在crypto/rsa目錄中。

這個結構定義了RSA內部數據信息。主要欄位含義:
version —— 版本。
meth —— RSA運算抽象方法集合。
n,e,d,p,q,dmp1,dmq1,iqmp —— 密鑰相關的大數。

這個結構定義了RSA內部各種運算抽象方法集合。主要欄位含義:
name —— 名稱描述。
rsa_pub_enc —— 公鑰加密方法。
rsa_pub_dec —— 公鑰解密方法。
rsa_priv_enc —— 私鑰加密方法。
rsa_priv_dec —— 公鑰解密方法。
rsa_sign —— 簽名方法。
rsa_verify —— 驗簽方法。
rsa_keygen —— 生成密鑰對方法。

在1.1.1中,大多數的數據結構已經不再向使用者開放,從封裝的角度來看,這是更合理的。如果你在頭文件中找不到結構定義,不妨去源碼中搜一搜。

RSA *RSA_new(void);
生成一個RSA密鑰結構,採用默認的rsa_pkcs1_ossl_meth方法。

void RSA_free(RSA *r);
釋放RSA結構。

RSA *RSA_generate_key(int bits, unsigned long e, void (*callback) (int, int, void *), void *cb_arg);
生成RSA密鑰(舊版本)。
bits為密鑰位數,e為公鑰指數。
callback為密鑰生成過程中的干預回調函數,通常傳入NULL。cb_arg為回調參數。
成功返回RSA指針,失敗返回NULL。

int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
生成RSA密鑰(新版本)。
rsa為RSA對帶老象指針。bits為密鑰位置,e為公鑰指數的大數形式指針。cb為干預回調函數,通常傳入NULL。
成功返回1,失敗返回0。
關於公鑰指數e,主要有兩個取值:
# define RSA_3 0x3L
# define RSA_F4 0x10001L

RSA *RSAPublicKey_p(RSA *rsa);
復制RSA公鑰部分。
成功返回RSA指針,失敗返回NULL。

RSA *RSAPrivateKey_p(RSA *rsa);
復制RSA私鑰部分。
成功返回RSA指針,失敗返回NULL。

int RSA_bits(const RSA *rsa);
獲取RSA密鑰位數。
int RSA_size(const RSA *rsa);
獲取RSA密鑰長度。

int RSA_check_key(const RSA *);
int RSA_check_key_ex(const RSA *, BN_GENCB *cb);
檢查RSA的有效性,必須為完整的密鑰對。
成功返回1,失敗返回0。

int RSA_print(BIO *bp, const RSA *r, int offset);
int RSA_print_fp(FILE *fp, const RSA *r, int offset);
將RSA信息輸出到bp/fp中,off為輸出信息在bp/fp中的偏移量,比如是屏幕bp/fp,則表示列印信息的位置離左邊屏幕邊緣的距離。

int RSA_public_encrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
RSA公鑰加密。
成功返回密文的長度,失敗返回-1。

int RSA_public_decrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
RSA公鑰解密。
成功返回明文的長度,失敗返回-1。

int RSA_private_encrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
RSA私鑰加密。
成功返回密文的長度,失敗返回-1。

int RSA_private_decrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
RSA私鑰解密。
成功返回明文的長度,失敗返回-1。

關於padding填充方式,取值:

其中PKCS1填充大小為11位元組,所以加密明文長度必須不大於(密鑰大小-11位元組)。
# define RSA_PKCS1_PADDING_SIZE 11

int RSA_sign(int type, const unsigned char *m, unsigned int m_length,
unsigned char *sigret, unsigned int *siglen, RSA *rsa);
對數據m生成RSA簽名,生成的簽名長度與key的長度相同,如512位密鑰生成64位元組簽名。
type指定摘要演算法的NID,如NID_sha1。
成功返回1,失敗返回0。

int RSA_verify(int type, const unsigned char *m, unsigned int m_length,
const unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
對數據m驗證RSA簽名。
type指定摘要演算法的NID,如NID_sha1。
成功返回1,失敗返回0。

以下函數在x509.h中定義:

int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa)
{
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
}
將RSA公鑰轉換為DER編碼,並寫入到bp抽象IO中。
成功返回1,失敗返回0。

RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
{
return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
}
從bp抽象IO中讀取DER編碼,並轉換為rsa結構私鑰。
成功返回有效指定,失敗返回NULL。

int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa)
{
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
}
將RSA公鑰轉換為DER編碼,並寫入到bp抽象IO中。
成功返回1,失敗返回0。

RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
{
return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
}
從bp抽象IO中讀取DER編碼,並轉換為rsa結構公鑰。
成功返回有效指定,失敗返回NULL。

下面這個例子演示了RSA密鑰對的生成、公私鑰的復制、公鑰加密和私鑰解密的用法。

輸出:

下面這個例子演示了公私鑰的分開保存、讀取,以及使用公私鑰加解密。

輸出:
RSA_generate_key_ex() ret:1
i2d_RSAPrivateKey_bio() ret:1
i2d_RSAPublicKey_bio() ret:1
' private key size:64
' public key size:64
RSA_public_encrypt() ret:64
RSA_private_decrypt() ret:10
text:[1234567890]

下面這個例子演示了簽名的生成和驗證操作。

輸出:
ret:1
RSA_sign() ret:1
sign 64

RSA_verify() ret:1

⑤ 如何用C語言來使用openssl rsa進行公鑰加密,已有公鑰和明文

1. 本程序使用2048位密鑰對,每次加密時,原始數據的最大長度為245位元組,加密後的密文長度為256位元組.(採用打PADDING 的加密方式)

2. 如果所加密數據長度大於245位元組,請分多次加密,後將密文按順序存儲;解密時,每次讀取256位元組,進行解密,將解密後的數據依次按順序存儲,即可還原原始數據.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#define OPENSSLKEY "test.key"
#define PUBLICKEY "test_pub.key"
#define BUFFSIZE 1024
char *my_encrypt(char *str, char *path_key); //加密
char *my_decrypt(char *str, char *path_key); //解密
int main(void)
{
char *source = "i like dancing !!!";
char *ptf_en, *ptf_de;
printf("source is :%s\n", source);
//1.加密
ptf_en = my_encrypt(source, PUBLICKEY);
if (ptf_en == NULL){
return 0;
}else{
printf("ptf_en is :%s\n", ptf_en);
}
//2.解密
ptf_de = my_decrypt(ptf_en, OPENSSLKEY);
if (ptf_de == NULL){
return 0;
}else{
printf("ptf_de is :%s\n", ptf_de);
}
if(ptf_en) free(ptf_en);
if(ptf_de) free(ptf_de);
return 0;
}
//加密
char *my_encrypt(char *str, char *path_key)
{
char *p_en = NULL;
RSA *p_rsa = NULL;
FILE *file = NULL;
int lenth = 0; //flen為源文件長度, rsa_len為秘鑰長度
//1.打開秘鑰文件
if((file = fopen(path_key, "rb")) == NULL)
{
perror("fopen() error 111111111 ");
goto End;
}
//2.從公鑰中獲取 加密的秘鑰
if((p_rsa = PEM_read_RSA_PUBKEY(file, NULL,NULL,NULL )) == NULL)
{
ERR_print_errors_fp(stdout);
goto End;
}
lenth = strlen(str);
p_en = (char *)malloc(256);
if(!p_en)
{
perror("malloc() error 2222222222");
goto End;
}
memset(p_en, 0, 256);
//5.對內容進行加密
if(RSA_public_encrypt(lenth, (unsigned char*)str, (unsigned char*)p_en, p_rsa, RSA_PKCS1_PADDING) < 0)
{
perror("RSA_public_encrypt() error 2222222222");
goto End;
}
End:
//6.釋放秘鑰空間, 關閉文件
if(p_rsa) RSA_free(p_rsa);
if(file) fclose(file);
return p_en;
}
//解密
char *my_decrypt(char *str, char *path_key)
{
char *p_de = NULL;
RSA *p_rsa = NULL;
FILE *file = NULL;
//1.打開秘鑰文件
file = fopen(path_key, "rb");
if(!file)
{
perror("fopen() error 22222222222");
goto End;
}
//2.從私鑰中獲取 解密的秘鑰
if((p_rsa = PEM_read_RSAPrivateKey(file, NULL,NULL,NULL )) == NULL)
{
ERR_print_errors_fp(stdout);
goto End;
}
p_de = (char *)malloc(245);
if(!p_de)
{
perror("malloc() error ");
goto End;
}
memset(p_de, 0, 245);
//5.對內容進行加密
if(RSA_private_decrypt(256, (unsigned char*)str, (unsigned char*)p_de, p_rsa, RSA_PKCS1_PADDING) < 0)
{
perror("RSA_public_encrypt() error ");
goto End;
}
End:
//6.釋放秘鑰空間, 關閉文件
if(p_rsa) RSA_free(p_rsa);
if(file) fclose(file);
return p_de;
}

⑥ openssl 如何使用

為一個基於密碼學的安全開發包,OpenSSL提供的功能相當強大和全面,囊括了主要的密碼演算法、常用的密鑰和證書封裝管理功能以及SSL協議,並提供了豐富的應用程序供測試或其它目的使用。
1.對稱加密演算法
OpenSSL一共提供了8種對稱加密演算法,其中7種是分組加密演算法,僅有的一種流加密演算法是RC4。這7種分組加密演算法分別是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持電子密碼本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種常用的分組密碼加密模式。其中,AES使用的加密反饋模式(CFB)和輸出反饋模式(OFB)分組長度是128位,其它演算法使用的則是64位。事實上,DES演算法裡面不僅僅是常用的DES演算法,還支持三個密鑰和兩個密鑰3DES演算法。
2.非對稱加密演算法
OpenSSL一共實現了4種非對稱加密演算法,包括DH演算法、RSA演算法、DSA演算法和橢圓曲線演算法(EC)。DH演算法一般用戶密鑰交換。RSA演算法既可以用於密鑰交換,也可以用於數字簽名,當然,如果你能夠忍受其緩慢的速度,那麼也可以用於數據加密。DSA演算法則一般只用於數字簽名。
3.信息摘要演算法
OpenSSL實現了5種信息摘要演算法,分別是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA演算法事實上包括了SHA和SHA1兩種信息摘要演算法,此外,OpenSSL還實現了DSS標准中規定的兩種信息摘要演算法DSS和DSS1。
4.密鑰和證書管理
密鑰和證書管理是PKI的一個重要組成部分,OpenSSL為之提供了豐富的功能,支持多種標准。
首先,OpenSSL實現了ASN.1的證書和密鑰相關標准,提供了對證書、公鑰、私鑰、證書請求以及CRL等數據對象的DER、PEM和BASE64的編解碼功能。OpenSSL提供了產生各種公開密鑰對和對稱密鑰的方法、函數和應用程序,同時提供了對公鑰和私鑰的DER編解碼功能。並實現了私鑰的PKCS#12和PKCS#8的編解碼功能。OpenSSL在標准中提供了對私鑰的加密保護功能,使得密鑰可以安全地進行存儲和分發。
在此基礎上,OpenSSL實現了對證書的X.509標准編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。並提供了一種文本資料庫,支持證書的管理功能,包括證書密鑰產生、請求產生、證書簽發、吊銷和驗證等功能。
事實上,OpenSSL提供的CA應用程序就是一個小型的證書管理中心(CA),實現了證書簽發的整個流程和證書管理的大部分機制。
5.SSL和TLS協議
OpenSSL實現了SSL協議的SSLv2和SSLv3,支持了其中絕大部分演算法協議。OpenSSL也實現了TLSv1.0,TLS是SSLv3的標准化版,雖然區別不大,但畢竟有很多細節不盡相同。
雖然已經有眾多的軟體實現了OpenSSL的功能,但是OpenSSL裡面實現的SSL協議能夠讓我們對SSL協議有一個更加清楚的認識,因為至少存在兩點:一是OpenSSL實現的SSL協議是開放源代碼的,我們可以追究SSL協議實現的每一個細節;二是OpenSSL實現的SSL協議是純粹的SSL協議,沒有跟其它協議(如HTTP)協議結合在一起,澄清了SSL協議的本來面目。
6.應用程序
OpenSSL的應用程序已經成為了OpenSSL重要的一個組成部分,其重要性恐怕是OpenSSL的開發者開始沒有想到的。現在OpenSSL的應用中,很多都是基於OpenSSL的應用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的應用程序實現的。OpenSSL的應用程序是基於OpenSSL的密碼演算法庫和SSL協議庫寫成的,所以也是一些非常好的OpenSSL的API使用範例,讀懂所有這些範例,你對OpenSSL的API使用了解就比較全面了,當然,這也是一項鍛煉你的意志力的工作。
OpenSSL的應用程序提供了相對全面的功能,在相當多的人看來,OpenSSL已經為自己做好了一切,不需要再做更多的開發工作了,所以,他們也把這些應用程序成為OpenSSL的指令。OpenSSL的應用程序主要包括密鑰生成、證書管理、格式轉換、數據加密和簽名、SSL測試以及其它輔助配置功能。
7.Engine機制 Engine機制的出現是在OpenSSL的0.9.6版的事情,開始的時候是將普通版本跟支持Engine的版本分開的,到了OpenSSL的0.9.7版,Engine機制集成到了OpenSSL的內核中,成為了OpenSSL不可缺少的一部分。 Engine機制目的是為了使OpenSSL能夠透明地使用第三方提供的軟體加密庫或者硬體加密設備進行加密。OpenSSL的Engine機製成功地達到了這個目的,這使得OpenSSL已經不僅僅使一個加密庫,而是提供了一個通用地加密介面,能夠與絕大部分加密庫或者加密設備協調工作。當然,要使特定加密庫或加密設備更OpenSSL協調工作,需要寫少量的介面代碼,但是這樣的工作量並不大,雖然還是需要一點密碼學的知識。Engine機制的功能跟Windows提供的CSP功能目標是基本相同的。目前,OpenSSL的0.9.7版本支持的內嵌第三方加密設備有8種,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬體加密設備。現在還出現了支持PKCS#11介面的Engine介面,支持微軟CryptoAPI的介面也有人進行開發。當然,所有上述Engine介面支持不一定很全面,比如,可能支持其中一兩種公開密鑰演算法。
8.輔助功能
BIO機制是OpenSSL提供的一種高層IO介面,該介面封裝了幾乎所有類型的IO介面,如內存訪問、文件訪問以及Socket等。這使得代碼的重用性大幅度提高,OpenSSL提供API的復雜性也降低了很多。
OpenSSL對於隨機數的生成和管理也提供了一整套的解決方法和支持API函數。隨機數的好壞是決定一個密鑰是否安全的重要前提。
OpenSSL還提供了其它的一些輔助功能,如從口令生成密鑰的API,證書簽發和管理中的配置文件機制等等。如果你有足夠的耐心,將會在深入使用OpenSSL的過程慢慢發現很多這樣的小功能,讓你不斷有新的驚喜。

⑦ ios openssl rsa 加密問題

對於您的操作,我這里有幾點建議:

  1. RSA模式的加密,加密數據的長度需要等於模長,對於這么短的密文,建議使用PKCS1標准進行打補丁,然後加解密;

  2. 模長1024的p1打補丁模式輸入數據長度最多不能超過117位元組,其餘位元組需要進行打補丁操作;

  3. 對於RSA加解密及簽名驗簽,通常會結合哈希演算法使用,對輸入數據進行哈希,然後打補丁,這樣可以不用限制輸入數據的長度;

  4. openssl本身是跨平台的,建議您使用打補丁模式在不同平台下進行測試。

熱點內容
androidia安裝 發布:2025-02-13 06:12:14 瀏覽:12
jsmcc文件夾 發布:2025-02-13 06:11:26 瀏覽:170
演算法與程序設計教案 發布:2025-02-13 06:10:51 瀏覽:55
ftp登錄需要輸入用戶名和密碼 發布:2025-02-13 06:03:33 瀏覽:398
數控編程代表 發布:2025-02-13 05:58:51 瀏覽:385
編程凸輪 發布:2025-02-13 05:38:21 瀏覽:691
判斷素數的編程 發布:2025-02-13 05:29:25 瀏覽:618
androidaes加密 發布:2025-02-13 05:08:36 瀏覽:493
李宗瑞文件夾 發布:2025-02-13 04:27:59 瀏覽:611
phpparent的parent 發布:2025-02-13 04:18:08 瀏覽:457