openssl java des_OPENSSL库的使用-DES篇
一、單DES算法ECB模式加解密
1、使用函數(shù)DES_set_key_unchecked設(shè)置密鑰
2、使用函數(shù)DES_ecb_encrypt來進(jìn)行數(shù)據(jù)加解密
void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output,
DES_key_schedule *ks,int enc);
函數(shù)功能說明:DES ECB計(jì)算
參數(shù)說明:
input: 輸入數(shù)據(jù);(8字節(jié)長(zhǎng)度)
output: 輸出數(shù)據(jù);(8字節(jié)長(zhǎng)度)
ks: 密鑰;
enc:加密:DES_ENCRYPT , 解密:DES_DECRYPT;
二、單DES算法CBC模式加解密
1、使用函數(shù)DES_set_key_unchecked設(shè)置密鑰
2、使用函數(shù)DES_ncbc_encrypt來進(jìn)行數(shù)據(jù)加解密
void DES_ncbc_encrypt(const unsigned char *input,unsigned char *output,
long length,DES_key_schedule *schedule,DES_cblock *ivec,
int enc);
參數(shù)說明:
input: 輸入數(shù)據(jù);(8字節(jié)長(zhǎng)度)
output: 輸出數(shù)據(jù);(8字節(jié)長(zhǎng)度)
length: 數(shù)據(jù)長(zhǎng)度;(這里數(shù)據(jù)長(zhǎng)度不包含初始化向量長(zhǎng)度)
schedule:密鑰;
ivec: 初始化向量;(一般為8個(gè)字節(jié)0)
enc:加密:DES_ENCRYPT , 解密:DES_DECRYPT;
三、T-DES算法ECB模式加解密
1、使用函數(shù)DES_set_key_unchecked設(shè)置密鑰
2、使用函數(shù)DES_ecb3_encrypt來進(jìn)行加解密
void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
DES_key_schedule *ks1,DES_key_schedule *ks2,
DES_key_schedule *ks3, int enc);
函數(shù)說明:
3DES ECB算法
參數(shù)說明:
input: 輸入數(shù)據(jù)
output: 輸出數(shù)據(jù)
ks1,ks2,ks3, 3DES算法的三只密鑰,實(shí)際應(yīng)用中,大家更習(xí)慣于用兩只密鑰,調(diào)用此函數(shù)時(shí),只需在ks3處傳入ks1即可;
enc:加密:DES_ENCRYPT , 解密:DES_DECRYPT
四、T-DES算法CBC模式加解密
1、使用函數(shù)DES_set_key_unchecked設(shè)置密鑰
2、使用函數(shù)DES_ede3_cbc_encrypt來進(jìn)行加解密
void DES_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output,
long length,
DES_key_schedule *ks1,DES_key_schedule *ks2,
DES_key_schedule *ks3,DES_cblock *ivec,int enc);
函數(shù)功能說明:
3DES CBC模式計(jì)算;
參數(shù)說明:
input: 輸入數(shù)據(jù);(8字節(jié)長(zhǎng)度)
output: 輸出數(shù)據(jù);(8字節(jié)長(zhǎng)度)
length: 長(zhǎng)度;(這里數(shù)據(jù)長(zhǎng)度不包含初始化向量長(zhǎng)度)
ks1:密鑰1;(為16字節(jié)密鑰的左邊8字節(jié))
ks2:密鑰2;(為16字節(jié)密鑰的右邊8字節(jié))
ks3:密鑰3;(為16字節(jié)密鑰的左邊8字節(jié))
ivec:初始化向量;;(一般為8個(gè)字節(jié)0)
enc:DES_ENCRYPT , 解密:DES_DECRYPT;
五、示例代碼
void CPage1::OnButtonEncrypt()
{
// TODO: Add your control notification handler code here
DES_cblock key;
unsigned char key_hex[256] = {0};
unsigned char data_hex[256] = {0};
unsigned char initval_hex[256] = {0};
unsigned char temp[256] = {0};
int i = 0;
int keylen = 0;
int datalen = 0;
int InitialLen = 0;
DES_key_schedule schedule;
DES_key_schedule schedule2;
DES_key_schedule schedule3;
const_DES_cblock input;
DES_cblock output;
DES_cblock ivec;
UpdateData(TRUE);
m_key.Remove(' ');
m_data.Remove(' ');
m_initval.Remove(' ');
keylen = m_key.GetLength()/2;
datalen = m_data.GetLength()/2;
InitialLen = m_initval.GetLength()/2;
if (keylen%8!=0)
{
AfxMessageBox("輸入密鑰長(zhǎng)度不是8的整數(shù)倍,請(qǐng)重新輸入!");
return;
}
if (datalen%8!=0)
{
AfxMessageBox("輸入數(shù)據(jù)長(zhǎng)度不是8的整數(shù)倍,請(qǐng)重新輸入!");
return;
}
StrToHex(m_key,key_hex,keylen);
StrToHex(m_data,data_hex,datalen);
StrToHex(m_initval,initval_hex,InitialLen);
//單DES密鑰設(shè)置
if (keylen == 8)
{
memcpy(key,key_hex,keylen);
DES_set_key_unchecked(&key, &schedule);
}
//三DES密鑰設(shè)置
else if (keylen == 16)
{
memcpy(key,key_hex,8);
DES_set_key_unchecked(&key, &schedule);
memcpy(key,key_hex+8,8);
DES_set_key_unchecked(&key, &schedule2);
memcpy(key,key_hex,8);
DES_set_key_unchecked(&key, &schedule3);
}
memcpy(ivec,initval_hex,InitialLen);
//單DES算法
if (keylen == 8)
{
//ECB模式
if (((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck())
{
for(i = 0;i < datalen/8;i++)
{
memcpy(input,data_hex+i*8,8);
DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);
memcpy(temp+i*8,output,8);
}
}
//CBC模式
else if (((CButton*)GetDlgItem(IDC_RADIO2))->GetCheck())
{
for(i = 0;i < datalen/8;i++)
{
DES_ncbc_encrypt(data_hex+i*8, temp+i*8,8,&schedule,&ivec, DES_ENCRYPT);
}
}
}
//TDES算法
else if (keylen == 16)
{
//ECB模式
if (((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck())
{
for (i = 0;i < datalen/8;i++)
{
memcpy(input,data_hex+i*8,8);
DES_ecb3_encrypt(&input, &output, &schedule, &schedule2, &schedule3, DES_ENCRYPT);
memcpy(temp+i*8,output,8);
}
}
//CBC模式
else if (((CButton*)GetDlgItem(IDC_RADIO2))->GetCheck())
{
for(i = 0;i < datalen/8;i++)
{
DES_ede3_cbc_encrypt(data_hex+i*8, temp+i*8,8,&schedule, &schedule2, &schedule3,&ivec, DES_ENCRYPT);
}
}
}
HexToStr(temp,datalen,m_result);
UpdateData(FALSE);
}
DES加解密 cbc模式 的簡(jiǎn)單講解 &;&; C++用openssl庫來實(shí)現(xiàn)的注意事項(xiàng)
DES cbc是基于數(shù)據(jù)塊加密的.數(shù)據(jù)塊的長(zhǎng)度為8字節(jié)64bit.以數(shù)據(jù)塊為單位循環(huán)加密,再拼接.每個(gè)數(shù)據(jù)塊加密的秘鑰一樣,IV向量不同.第一個(gè)數(shù)據(jù)快所需的IV向量,需要我們提供,從第二個(gè)數(shù)據(jù)塊開始, ...
C++ 使用openssl庫實(shí)現(xiàn) DES 加密——CBC模式 &;&; RSA加密——公加私解——私加公解
之前工作上需要用C++把軟件生成的用戶序列號(hào)用des加密cbc的模式,加密后為二進(jìn)制,轉(zhuǎn)化為十六進(jìn)制,然后提供給java寫的授權(quán)碼管理平臺(tái). java平臺(tái)會(huì)根據(jù)用戶序列號(hào),生成一個(gè)授權(quán)碼,授權(quán)碼是用r ...
使用openssl庫實(shí)現(xiàn)des,3des加密
總結(jié)
以上是生活随笔為你收集整理的openssl java des_OPENSSL库的使用-DES篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020FME博客大赛——地下管线-雨水
- 下一篇: MT6853(联发科技天玑 720 )核