OpenSSL中AES加密的用法

2021-09-04 13:22:32 字數 2147 閱讀 5690

使用api的時候,需要特別小心資料長度,我在初次使用的時候簡直被弄的暈頭轉向,遂作此文留個備忘。一般沒有指定長度的引數,預設都是16(aes_block_size)個位元組。輸出資料的長度一般都是16位元組的倍數,否則會出現陣列越界訪問。 

以下api中,encrypt表示加密,decrypt表示解密。

int aes_set_encrypt_key(const unsigned char *userkey, const int bits,

aes_key *key);

int aes_set_decrypt_key(const unsigned char *userkey, const int bits,

aes_key *key);

引數說明:

引數名稱

描述userkey

使用者指定的密碼。注意:只能是16、24、32位元組。如果密碼字串長度不夠,可以在字串末尾追加一些特定的字元,或者重複密碼字串,直到滿足最少的長度。

bits

密碼位數。即userkey的長度 * 8,只能是128、192、256位。

key向外輸出引數。

如果函式呼叫成功,返回0,否則是負數。

void aes_encrypt(const unsigned char *in, unsigned char *out,

const aes_key *key);

void aes_decrypt(const unsigned char *in, unsigned char *out,

const aes_key *key);

引數說明:

引數名稱

描述in

輸入資料。必須是16位元組。

out輸出資料。必須是16位元組。

key使用aes_set_encrypt/decrypt_key生成的key。

aes_encrypt/aes_decrypt一次只處理16個位元組。如果輸入資料較長,你需要使用迴圈語句,每16個位元組處理一次,直到所有資料處理完畢。如果資料不足16位元組,可以用0填充至16位元組。

void aes_cbc_encrypt(const unsigned char *in, unsigned char *out,

size_t length, const aes_key *key,

unsigned char *ivec, const int enc);

引數說明:

引數名稱

描述in

輸入資料。長度任意。

out輸出資料。能夠容納下輸入資料,且長度必須是16位元組的倍數。

length

輸入資料的實際長度。

key使用aes_set_encrypt/decrypt_key生成的key。

ivec

可讀寫的一塊記憶體。長度必須是16位元組。

enc是否是加密操作。aes_encrypt表示加密,aes_decrypt表示解密。

這個函式比aes_encrypt多了乙個ivec引數,ivec的內容可以任意指定,但是加密和解密操作必須使用同樣的資料。在aes_cbc_encrypt底層,實際上是每16個位元組做一次處理,先和ivec做異或運算,然後呼叫aes_encrypt函式進行加密。 

aes_cbc_encrypt在加密的過程中會修改ivec的內容,因此ivec引數不能是乙個常量,而且不能在傳遞給加密函式後再立馬傳遞給解密函式,必須重新賦值之後再傳遞給解密函式。

關於輸出資料的長度

輸出資料緩衝區的長度必須是16位元組的倍數,加密完成後,比輸入長度多出來的輸出資料是不可以丟棄的。因此,存檔的時候,需要記錄原始資料的長度

關於輸入資料的長度不必是16位元組的倍數(做個備忘):

下面是aes_cbc_encrypt函式的底層實現**

... 

//處理16位元組倍數的資料

while (len >= 16)

//當資料小於16位元組的時候,進入下面的迴圈

while (len)

其他加密函式我還沒有用過,在此就不繼續列舉了,但是引數跟上面幾個相似,弄明白上面的就不成問題。

openSSL實現AES加密

openssl是很常見的c介面的庫,個人覺得易用。以下是aescbc cfb ecb加密方式的用法都是類似的,只是函式名有點區別,就不一一枚舉了。一 介面簡介 設定加密金鑰,使用字元緩衝區 intaes set encrypt key const unsigned char userkey,cons...

openssl 實現 aes 檔案加密解密

linux 環境 基礎 安裝 openssl 加密用 安裝 python 環境 換金鑰用 bin sh py file zone aes tool py key iv in file out file 獲取金鑰k,向量v,輸入檔案i,輸出檔案o while getopts k v i o opt d...

PHP使用OpenSSL實現AES加密的筆記

記錄這兩天遇到的一些問題,一開始主要是對一些概念理解的不清楚 比如aes是一種演算法,而openssl是乙個擴充套件庫,其中包含對aes演算法的實現 當然在完全理解演算法後可以自己實現,但可能會遇到很多問題,我會在以後進行嘗試 目前在專案的使用中,還是使用擴充套件庫的方法最快最簡單 1,加密方法 通...