OpenSSL中对称加密算法DES常用函数使用举例

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

主要包括3个文件:

1. cryptotest.h:

#ifndef _CRYPTOTEST_H_#define _CRYPTOTEST_H_#include <string>using namespace std;typedef enum { GENERAL = 0, ECB, CBC, CFB, OFB, TRIPLE_ECB, TRIPLE_CBC}CRYPTO_MODE;string DES_Encrypt(const string cleartext, const string key, CRYPTO_MODE mode);string DES_Decrypt(const string ciphertext, const string key, CRYPTO_MODE mode);#endif //_CRYPTOTEST_H_

2. destest.cpp:

#include <iostream>#include <string>#include <vector>#include <openssl/des.h>#include "cryptotest.h"using namespace std;static unsigned char cbc_iv[8] = {'0', '1', 'A', 'B', 'a', 'b', '9', '8'};string DES_Encrypt(const string cleartext, const string key, CRYPTO_MODE mode){ string strCipherText; switch (mode) { case GENERAL: case ECB:  {   DES_cblock keyEncrypt;   memset(keyEncrypt, 0, 8);   if (key.length() <= 8)     memcpy(keyEncrypt, key.c_str(), key.length());   else     memcpy(keyEncrypt, key.c_str(), 8);   DES_key_schedule keySchedule;   DES_set_key_unchecked(&keyEncrypt, &keySchedule);    const_DES_cblock inputText;   DES_cblock outputText;   vector<unsigned char> vecCiphertext;   unsigned char tmp[8];   for (int i = 0; i < cleartext.length() / 8; i ++) {    memcpy(inputText, cleartext.c_str() + i * 8, 8);    DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_ENCRYPT);    memcpy(tmp, outputText, 8);    for (int j = 0; j < 8; j++)     vecCiphertext.push_back(tmp[j]);   }   if (cleartext.length() % 8 != 0) {    int tmp1 = cleartext.length() / 8 * 8;    int tmp2 = cleartext.length() - tmp1;    memset(inputText, 0, 8);    memcpy(inputText, cleartext.c_str() + tmp1, tmp2);    DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_ENCRYPT);    memcpy(tmp, outputText, 8);    for (int j = 0; j < 8; j++)     vecCiphertext.push_back(tmp[j]);   }   strCipherText.clear();   strCipherText.assign(vecCiphertext.begin(), vecCiphertext.end());  }  break; case CBC:  {   DES_cblock keyEncrypt, ivec;   memset(keyEncrypt, 0, 8);   if (key.length() <= 8)     memcpy(keyEncrypt, key.c_str(), key.length());   else     memcpy(keyEncrypt, key.c_str(), 8);   DES_key_schedule keySchedule;   DES_set_key_unchecked(&keyEncrypt, &keySchedule);    memcpy(ivec, cbc_iv, sizeof(cbc_iv));   int iLength = cleartext.length() % 8 ? (cleartext.length() / 8 + 1) * 8 : cleartext.length();   unsigned char* tmp = new unsigned char[iLength + 16];   memset(tmp, 0, iLength);   DES_ncbc_encrypt((const unsigned char*)cleartext.c_str(), tmp, cleartext.length()+1, &keySchedule, &ivec, DES_ENCRYPT);    strCipherText = (char*)tmp;   delete [] tmp;  }  break; case CFB:  {   DES_cblock keyEncrypt, ivec;   memset(keyEncrypt, 0, 8);   if (key.length() <= 8)     memcpy(keyEncrypt, key.c_str(), key.length());   else     memcpy(keyEncrypt, key.c_str(), 8);   DES_key_schedule keySchedule;   DES_set_key_unchecked(&keyEncrypt, &keySchedule);    memcpy(ivec, cbc_iv, sizeof(cbc_iv));   unsigned char* outputText = new unsigned char[cleartext.length()];   memset(outputText, 0, cleartext.length());   const unsigned char* tmp = (const unsigned char*)cleartext.c_str();   DES_cfb_encrypt(tmp, outputText, 8, cleartext.length(), &keySchedule, &ivec, DES_ENCRYPT);   strCipherText = (char*)outputText;      delete [] outputText;  }  break; case TRIPLE_ECB:  {   DES_cblock ke1, ke2, ke3;   memset(ke1, 0, 8);   memset(ke2, 0, 8);   memset(ke2, 0, 8);   if (key.length() >= 24) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, 8);    memcpy(ke3, key.c_str() + 16, 8);   } else if (key.length() >= 16) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, 8);    memcpy(ke3, key.c_str() + 16, key.length() - 16);   } else if (key.length() >= 8) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, key.length() - 8);    memcpy(ke3, key.c_str(), 8);   } else {    memcpy(ke1, key.c_str(), key.length());    memcpy(ke2, key.c_str(), key.length());    memcpy(ke3, key.c_str(), key.length());   }   DES_key_schedule ks1, ks2, ks3;   DES_set_key_unchecked(&ke1, &ks1);   DES_set_key_unchecked(&ke2, &ks2);   DES_set_key_unchecked(&ke3, &ks3);   const_DES_cblock inputText;   DES_cblock outputText;   vector<unsigned char> vecCiphertext;   unsigned char tmp[8];   for (int i = 0; i < cleartext.length() / 8; i ++) {    memcpy(inputText, cleartext.c_str() + i * 8, 8);    DES_ecb3_encrypt(&inputText, &outputText, &ks1, &ks2, &ks3, DES_ENCRYPT);    memcpy(tmp, outputText, 8);    for (int j = 0; j < 8; j++)     vecCiphertext.push_back(tmp[j]);   }   if (cleartext.length() % 8 != 0) {    int tmp1 = cleartext.length() / 8 * 8;    int tmp2 = cleartext.length() - tmp1;    memset(inputText, 0, 8);    memcpy(inputText, cleartext.c_str() + tmp1, tmp2);    DES_ecb3_encrypt(&inputText, &outputText, &ks1, &ks2, &ks3, DES_ENCRYPT);    memcpy(tmp, outputText, 8);    for (int j = 0; j < 8; j++)     vecCiphertext.push_back(tmp[j]);   }   strCipherText.clear();   strCipherText.assign(vecCiphertext.begin(), vecCiphertext.end());  }  break; case TRIPLE_CBC:  {   DES_cblock ke1, ke2, ke3, ivec;   memset(ke1, 0, 8);   memset(ke2, 0, 8);   memset(ke2, 0, 8);   if (key.length() >= 24) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, 8);    memcpy(ke3, key.c_str() + 16, 8);   } else if (key.length() >= 16) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, 8);    memcpy(ke3, key.c_str() + 16, key.length() - 16);   } else if (key.length() >= 8) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, key.length() - 8);    memcpy(ke3, key.c_str(), 8);   } else {    memcpy(ke1, key.c_str(), key.length());    memcpy(ke2, key.c_str(), key.length());    memcpy(ke3, key.c_str(), key.length());   }   DES_key_schedule ks1, ks2, ks3;   DES_set_key_unchecked(&ke1, &ks1);   DES_set_key_unchecked(&ke2, &ks2);   DES_set_key_unchecked(&ke3, &ks3);   memcpy(ivec, cbc_iv, sizeof(cbc_iv));   int iLength = cleartext.length() % 8 ? (cleartext.length() / 8 + 1) * 8 : cleartext.length();   unsigned char* tmp = new unsigned char[iLength + 16];   memset(tmp, 0, iLength);   DES_ede3_cbc_encrypt((const unsigned char*)cleartext.c_str(), tmp, cleartext.length()+1, &ks1, &ks2, &ks3, &ivec, DES_ENCRYPT);   strCipherText = (char*)tmp;   delete [] tmp;  }  break; } return strCipherText;}string DES_Decrypt(const string ciphertext, const string key, CRYPTO_MODE mode){ string strClearText; switch (mode) { case GENERAL: case ECB:  {   DES_cblock keyEncrypt;   memset(keyEncrypt, 0, 8);   if (key.length() <= 8)     memcpy(keyEncrypt, key.c_str(), key.length());   else     memcpy(keyEncrypt, key.c_str(), 8);   DES_key_schedule keySchedule;   DES_set_key_unchecked(&keyEncrypt, &keySchedule);    const_DES_cblock inputText;   DES_cblock outputText;   vector<unsigned char> vecCleartext;   unsigned char tmp[8];   for (int i = 0; i < ciphertext.length() / 8; i ++) {    memcpy(inputText, ciphertext.c_str() + i * 8, 8);    DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_DECRYPT);    memcpy(tmp, outputText, 8);    for (int j = 0; j < 8; j++)     vecCleartext.push_back(tmp[j]);   }   if (ciphertext.length() % 8 != 0) {    int tmp1 = ciphertext.length() / 8 * 8;    int tmp2 = ciphertext.length() - tmp1;    memset(inputText, 0, 8);    memcpy(inputText, ciphertext.c_str() + tmp1, tmp2);    DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_DECRYPT);    memcpy(tmp, outputText, 8);    for (int j = 0; j < 8; j++)     vecCleartext.push_back(tmp[j]);   }   strClearText.clear();   strClearText.assign(vecCleartext.begin(), vecCleartext.end());  }  break; case CBC:  {   DES_cblock keyEncrypt, ivec;   memset(keyEncrypt, 0, 8);   if (key.length() <= 8)     memcpy(keyEncrypt, key.c_str(), key.length());   else     memcpy(keyEncrypt, key.c_str(), 8);   DES_key_schedule keySchedule;   DES_set_key_unchecked(&keyEncrypt, &keySchedule);    memcpy(ivec, cbc_iv, sizeof(cbc_iv));   int iLength = ciphertext.length() % 8 ? (ciphertext.length() / 8 + 1) * 8 : ciphertext.length();   unsigned char* tmp = new unsigned char[iLength];   memset(tmp, 0, iLength);   DES_ncbc_encrypt((const unsigned char*)ciphertext.c_str(), tmp, ciphertext.length()+1, &keySchedule, &ivec, DES_DECRYPT);   strClearText = (char*)tmp;   delete [] tmp;  }  break; case CFB:  {   DES_cblock keyEncrypt, ivec;   memset(keyEncrypt, 0, 8);   if (key.length() <= 8)     memcpy(keyEncrypt, key.c_str(), key.length());   else     memcpy(keyEncrypt, key.c_str(), 8);   DES_key_schedule keySchedule;   DES_set_key_unchecked(&keyEncrypt, &keySchedule);    memcpy(ivec, cbc_iv, sizeof(cbc_iv));   unsigned char* outputText = new unsigned char[ciphertext.length()];   memset(outputText, 0, ciphertext.length());   const unsigned char* tmp = (const unsigned char*)ciphertext.c_str();   DES_cfb_encrypt(tmp, outputText, 8, 32/*ciphertext.length() - 16*/, &keySchedule, &ivec, DES_DECRYPT);   strClearText = (char*)outputText;   delete [] outputText;  }  break; case TRIPLE_ECB:  {   DES_cblock ke1, ke2, ke3;   memset(ke1, 0, 8);   memset(ke2, 0, 8);   memset(ke2, 0, 8);   if (key.length() >= 24) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, 8);    memcpy(ke3, key.c_str() + 16, 8);   } else if (key.length() >= 16) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, 8);    memcpy(ke3, key.c_str() + 16, key.length() - 16);   } else if (key.length() >= 8) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, key.length() - 8);    memcpy(ke3, key.c_str(), 8);   } else {    memcpy(ke1, key.c_str(), key.length());    memcpy(ke2, key.c_str(), key.length());    memcpy(ke3, key.c_str(), key.length());   }   DES_key_schedule ks1, ks2, ks3;   DES_set_key_unchecked(&ke1, &ks1);   DES_set_key_unchecked(&ke2, &ks2);   DES_set_key_unchecked(&ke3, &ks3);   const_DES_cblock inputText;   DES_cblock outputText;   vector<unsigned char> vecCleartext;   unsigned char tmp[8];   for (int i = 0; i < ciphertext.length() / 8; i ++) {    memcpy(inputText, ciphertext.c_str() + i * 8, 8);    DES_ecb3_encrypt(&inputText, &outputText, &ks1, &ks2, &ks3, DES_DECRYPT);    memcpy(tmp, outputText, 8);    for (int j = 0; j < 8; j++)     vecCleartext.push_back(tmp[j]);   }   if (ciphertext.length() % 8 != 0) {    int tmp1 = ciphertext.length() / 8 * 8;    int tmp2 = ciphertext.length() - tmp1;    memset(inputText, 0, 8);    memcpy(inputText, ciphertext.c_str() + tmp1, tmp2);    DES_ecb3_encrypt(&inputText, &outputText, &ks1, &ks2, &ks3, DES_DECRYPT);    memcpy(tmp, outputText, 8);    for (int j = 0; j < 8; j++)     vecCleartext.push_back(tmp[j]);   }   strClearText.clear();   strClearText.assign(vecCleartext.begin(), vecCleartext.end());  }  break; case TRIPLE_CBC:  {   DES_cblock ke1, ke2, ke3, ivec;   memset(ke1, 0, 8);   memset(ke2, 0, 8);   memset(ke2, 0, 8);   if (key.length() >= 24) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, 8);    memcpy(ke3, key.c_str() + 16, 8);   } else if (key.length() >= 16) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, 8);    memcpy(ke3, key.c_str() + 16, key.length() - 16);   } else if (key.length() >= 8) {    memcpy(ke1, key.c_str(), 8);    memcpy(ke2, key.c_str() + 8, key.length() - 8);    memcpy(ke3, key.c_str(), 8);   } else {    memcpy(ke1, key.c_str(), key.length());    memcpy(ke2, key.c_str(), key.length());    memcpy(ke3, key.c_str(), key.length());   }   DES_key_schedule ks1, ks2, ks3;   DES_set_key_unchecked(&ke1, &ks1);   DES_set_key_unchecked(&ke2, &ks2);   DES_set_key_unchecked(&ke3, &ks3);   memcpy(ivec, cbc_iv, sizeof(cbc_iv));   int iLength = ciphertext.length() % 8 ? (ciphertext.length() / 8 + 1) * 8 : ciphertext.length();   unsigned char* tmp = new unsigned char[iLength];   memset(tmp, 0, iLength);   DES_ede3_cbc_encrypt((const unsigned char*)ciphertext.c_str(), tmp, ciphertext.length()+1, &ks1, &ks2, &ks3, &ivec, DES_DECRYPT);   strClearText = (char*)tmp;   delete [] tmp;  }  break; } return strClearText;}

3. main.cpp:

#include "stdafx.h"#include "cryptotest.h"#include <iostream>#include <string>using namespace std;void test_DES(){ string cleartext = "中国北京12345$abcde%ABCDE@!!!!"; string ciphertext = ""; string key = "beijingchina1234567890ABCDEFGH!!!"; CRYPTO_MODE mode = TRIPLE_CBC; ciphertext = DES_Encrypt(cleartext, key, mode); string decrypt = DES_Decrypt(ciphertext, key, mode); cout<<"src cleartext: "<<cleartext<<endl; cout<<"genarate ciphertext: "<<ciphertext<<endl; cout<<"src ciphertext: "<<ciphertext<<endl; cout<<"genarate cleartext: "<<decrypt<<endl; if (strcmp(cleartext.c_str(), decrypt.c_str()) == 0)  cout<<"DES crypto ok!!!"<<endl; else  cout<<"DES crypto error!!!"<<endl;}int main(int argc, char* argv[]){ test_DES(); cout<<"ok!!!"<<endl; return 0;}
  GitHubhttps://github.com/fengbingchun/OpenSSL_Test


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值