openssl加密解密
❶ 如何調用openssl 的加解密演算法 進行base64 aes-128
提供個加密函數代碼:
#define MAX_ENCRYPT_LEN 1024
void MyEncrypt(const unsigned char *sMsg, int cbMsg, unsigned char *sEncryptMsg, int &cbEncryptMsg)
{
OpenSSL_add_all_algorithms();
//產生會話密鑰
unsigned char SessionKey[16];
RAND_bytes(SessionKey,16);
//加密
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
if(EVP_EncryptInit_ex(&ctx,EVP_get_cipherbynid(NID_aes_128_ecb),NULL,SessionKey,NULL))
{
int offseti=0;
int offseto=0;
int offsett=0;
for(;;)
{
if(cbMsg-offseti<=MAX_ENCRYPT_LEN)
{
EVP_EncryptUpdate(&ctx, sEncryptMsg+offseto, &offsett, sMsg+offseti, cbMsg-offseti);
offseto+=offsett;
break;
}
else
{
EVP_EncryptUpdate(&ctx, sEncryptMsg+offseto, &offsett, sMsg+offseti, MAX_SIGN_MSG);
offseti+=MAX_SIGN_MSG;
offseto+=offsett;
}
}
EVP_EncryptFinal_ex(&ctx, sEncryptMsg+offseto, &offsett);
offseto+=offsett;
cbEncryptMsg=offseto;
}
EVP_CIPHER_CTX_cleanup(&ctx);
}
參數解釋:
const unsigned char *sMsg 需要解密的明文
int cbMsg 明文長度
unsigned char *sEncryptMsg 輸出密文
int &cbEncryptMsg 密文長度
好了,這個函數剛寫的,驗證了一下,是沒有問題的
解密與這個比較類似
❷ openssl 加密演算法區別
openssl加密演算法區別是:RSA/DSA ,不同的是RSA可以用於加/解密,也可以用於簽名驗簽,DSA則只能用於簽名。至於SHA則是一種和md5相同的演算法。
它不是用於加密解密或者簽名的,它被稱為摘要演算法。就是通過一種演算法,依據數據內容生成一種固定長度的摘要,這串摘要值與原數據存在對應關系,就是原數據會生成這個摘要,但是,這個摘要是不能還原成原數據的。
正常情況下是這樣的,這個演算法起的作用就是,如果你把原數據修改一點點,那麼生成的摘要都會不同,傳輸過程中把原數據給你再給你一個摘要,你把得到的原數據同樣做一次摘要演算法,與給你的摘要相比較就可以知道這個數據有沒有在傳輸過程中被修改了。
openssl加密演算法的實際運用:
實際應用過程中,因為需要加密的數據可能會很大,進行加密費時費力,所以一般都會把原數據先進行摘要,然後對這個摘要值進行加密,將原數據的明文和加密後的。
摘要值一起傳給你。這樣你解開加密後的摘要值,再和你得到的數據進行的摘要值對應一下就可以知道數據有沒有被修改了。
而且,因為私鑰只有你有,只有你能解密摘要值,所以別人就算把原數據做了修改,然後生成一個假的摘要給你也是不行的,你這邊用密鑰也根本解不開。
❸ 如何解密以前加密通過OpenSSL加密的字元串
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<openssl/rsa.h>#include<openssl/engine.h> int main(int argc, char* argv[]){ printf("openssl_test begin\n"); RSA* rsa=NULL; char originstr[]="hello\n"; //這是我們需要加密的原始數據 //allocate RSA structure,首先需要申請一個RSA結構題用於存放生成的公私鑰,這里rsa就是這個結構體的指針 rsa = RSA_new(); if(rsa==NULL) { printf("RSA_new failed\n"); return -1; } //generate RSA keys BIGNUM* exponent; exponent = BN_new(); //生成RSA公私鑰之前需要選擇一個奇數(odd number)來用於生成公私鑰 if(exponent ==NULL) { printf("BN_new failed\n"); goto FAIL1; } if(0==BN_set_word(exponent,65537)) //這里選擇奇數65537 { printf("BN_set_word failed\n"); goto FAIL1; } //這里molus的長度選擇4096,小於1024的molus長度都是不安全的,容易被破解 if(0==RSA_generate_key_ex(rsa,4096,exponent,NULL)) { printf("RSA_generate_key_ex failed\n"); goto FAIL; } char* cipherstr = NULL; //分配一段空間用於存儲加密後的數據,這個空間的大小由RSA_size函數根據rsa算出 cipherstr = malloc(RSA_size(rsa)); if(cipherstr==NULL) { printf("malloc cipherstr buf failed\n"); goto FAIL1; } //下面是實際的加密過程,最後一個參數padding type,有以下幾種。 /*RSA_PKCS1_PADDINGPKCS #1 v1.5 padding. This currently is the most widely used mode.RSA_PKCS1_OAEP_PADDINGEME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty encoding parameter. This mode is recommended for all new applications.RSA_SSLV23_PADDINGPKCS #1 v1.5 padding with an SSL-specific modification that denotes that the server is SSL3 capable.RSA_NO_PADDINGRaw RSA encryption. This mode should only be used to implement cryptographically sound padding modes in the application code. Encrypting user data directly with RSA is insecure.*/ //這里首先用公鑰進行加密,選擇了RSA_PKCS1_PADDING if(RSA_size(rsa)!=RSA_public_encrypt(strlen(originstr)+1,originstr,cipherstr,rsa,RSA_PKCS1_PADDING)) { printf("encryption failure\n"); goto FAIL2; } printf("the original string is %s\n",originstr); printf("the encrypted string is %s\n",cipherstr); //Now, let's decrypt the string with private key //下面來用私鑰解密,首先需要一個buffer用於存儲解密後的數據,這個buffer的長度要足夠(小於RSA_size(rsa)) //這里分配一個長度為250的字元數組,應該是夠用的。 char decrypted_str[250]; int decrypted_len; if(-1=(decrypted_len=RSA_private_decrypt(256,cipherstr,decrypted_str,rsa,RSA_PKCS1_PADDING))) { printf("decryption failure\n"); goto FAIL2; } printf("decrypted string length is %d,decryped_str is %s\n",decrypted_len,decrypted_str);FAIL2: free(cipherstr);FAIL1: BN_free(exponent);FAIL: RSA_free(rsa); return 0;}
以上是源代碼,下面使用下面的編譯命令在源碼所在路徑下生成可執行文件 gcc *.c -o openssl_test -lcrypto -ldl -L/usr/local/ssl/lib -I/usr/local/ssl/include其中,-lcrypto和-ldl是必須的,前者是OpenSSL中的加密演算法庫,後者是用於成功載入動態庫。
❹ openssl unix口令密文怎麼解密
下面我將單介紹使用Openssl進行文件的對稱加密操作。
一、Openssl支持的加密演算法有:
-aes-128-cbc -aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ecb -aes-128-ofb
-aes-192-cbc -aes-192-cfb -aes-192-cfb1
-aes-192-cfb8 -aes-192-ecb -aes-192-ofb
-aes-256-cbc -aes-256-cfb -aes-256-cfb1
-aes-256-cfb8 -aes-256-ecb -aes-256-ofb
-aes128 -aes192 -aes256
-bf -bf-cbc -bf-cfb
-bf-ecb -bf-ofb -blowfish
-cast -cast-cbc -cast5-cbc
-cast5-cfb -cast5-ecb -cast5-ofb
-des -des-cbc -des-cfb
-des-cfb1 -des-cfb8 -des-ecb
-des-ede -des-ede-cbc -des-ede-cfb
-des-ede-ofb -des-ede3 -des-ede3-cbc
-des-ede3-cfb -des-ede3-ofb -des-ofb
-des3 -desx -desx-cbc
-rc2 -rc2-40-cbc -rc2-64-cbc
-rc2-cbc -rc2-cfb -rc2-ecb
-rc2-ofb -rc4 -rc4-40
二、Openssl加密指令語法:
SYNOPSIS
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e]
[-d] [-a] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-p]
[-P] [-bufsize number] [-nopad] [-debug]
說明:
-chipername選項:加密演算法,Openssl支持的演算法在上面已經列出了,你只需選擇其中一種演算法即可實現文件加密功能。
-in選項:輸入文件,對於加密來說,輸入的應該是明文文件;對於解密來說,輸入的應該是加密的文件。該選項後面直接跟文件名。
-out選項:輸出文件,對於加密來說,輸出的應該是加密後的文件名;對於解密來說,輸出的應該是明文文件名。
-pass選項:選擇輸入口令的方式,輸入源可以是標准輸入設備,命令行輸入,文件、變數等。
-e選項:實現加密功能(不使用-d選項的話默認是加密選項)。
-d選項:實現解密功能。
-a和-A選項:對文件進行BASE64編解碼操作。
-K選項:手動輸入加密密鑰(不使用該選項,Openssl會使用口令自動提取加密密鑰)。
-IV選項:輸入初始變數(不使用該選項,Openssl會使用口令自動提取初始變數)。
-salt選項:是否使用鹽值,默認是使用的。
-p選項:列印出加密演算法使用的加密密鑰。
三、案例:
1. 使用aes-128-cbc演算法加密文件:
openssl enc -aes-128-cbc -in install.log -out enc.log
(註:這里install.log是你想要加密的文件,enc.log是加密後的文件,回車後系統會提示你輸入口令)
2. 解密剛剛加密的文件:
openssl enc -d -aes-128-cbc -in enc.log -out install.log
(註:enc.log是剛剛加密的文件,install.log是解密後的文件,-d選項實現解密功能)
3.加密文件後使用BASE64格式進行編碼:
openssl enc -aes-128-cbc -in install.log -out enc.log -a
4.使用多種口令輸入方式加密:
openssl enc -des-ede3-cbc -in install.log -out enc.log -pass pass:111111
(這種方式的好處是你可以把它寫入到腳本中,自動完成加密功能,不使用pass選項默認系統會提示輸入口令,並且確認,是需要人工操作的)
四、Openssl的功能還遠不只於此,感興趣的朋友可以參考Openssl的手冊學習。在Linux系統中你可以通過:man openssl 快速獲得幫助文件。
例:對文件file.tar.gz進行加密,密碼為123456
openssl des3 -salt -k 123456 -in file.tar.gz -out file.tar.gz.des3
對file.tar.gz.des3 解密
openssl enc -des3 -d -in file.tar.gz.des3 -out file.tar.gz
❺ 如何利用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中的加密演算法庫,後者是用於成功載入動態庫。
❻ 如何使用Openssl 私鑰進行解密
在ubuntu上要使用openssl的話需要先進行安裝,命令如下: sudo apt-get install openssl 安裝完成就可以使用openssl了。 首先需要進入openssl的交互界面,在命令行了輸入openssl即可; 1)生成RSA私鑰: genrsa -out rsa_private_key.pem 1024 該命令會生成1024位的私鑰,生成成功的界面如下: 此時我們就可以在當前路徑下看到rsa_private_key.pem文件了。 2)把RSA私鑰轉換成PKCS8格式輸入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt,並回車得到生成功的結果,這個結果就是PKCS8格式的私鑰,如下圖: 3) 生成RSA公鑰 輸入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,並回車,得到生成成功的結果,如下圖: 此時,我們可以看到一個文件名為rsa_public_key.pem的文件,打開它,可以看到-----BEGIN PUBLIC KEY-----開頭,-----END PUBLIC KEY-----結尾的沒有換行的字元串,這個就是公鑰。
❼ openssl aes_256_cbc加解密的問題
因為加密會分組,分組長度取決於你的密鑰長度,不足部分就會填充。所以加密後的字元串會大於等於加密前長度。
反過來解密字元串就會小於等於解密前字元串長度。
❽ 為什麼OPENSSL在C++/PHP下AES加密解密結果不一致
結果應該是一樣的,你查看下是多少位加密 128位和256位肯定是不一樣的。
其次 看看 AES_KEY 是否一致,仔細比較下兩者的 key和iv,如果這兩個不一樣,那麼結果肯定不一樣。尤其是iv,PHP封裝的是否默認有了個iv。
你要比較AES_KEY 的key和iv中每個char,不僅僅是輸出的字元串。不能應為有\0字元串的結尾標志而忽略。
如果這些一致,加密加過肯定是一致的。
❾ 如何使用Openssl,已經有Key文件,如何使用這個文件進行加密和解密
個東西,我這邊需要將一個字元串加密以後傳遞給第三方公司提供的jsp頁面。加密方式是第三方提供一個Key文件,就像銀行網銀用的文件證書一樣,使用RSA方式加密的。現在第三方公司給我了兩個文件:server.cer和test.pfx。
他們給的ReadME文件內容如下:
p ,可以用於解密和加密兩個功能。
cer里只包含公