OpenSSL中对称加密算法DES常用函数使用举例
2015-01-11 16:09
956 查看
主要包括3个文件:
1. cryptotest.h:
2. destest.cpp:
3. main.cpp:
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; }GitHub:https://github.com/fengbingchun/OpenSSL_Test
相关文章推荐
- OpenSSL中对称加密算法DES常用函数使用举例
- OpenSSL中对称加密算法DES常用函数使用举例
- 对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例
- 对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例
- 对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例
- 非对称加密算法之RSA介绍及OpenSSL中RSA常用函数使用举例
- 摘要算法之MD5介绍及OpenSSL中MD5常用函数使用举例
- 摘要算法之MD5介绍及OpenSSL中MD5常用函数使用举例
- 非对称加密算法之RSA介绍及OpenSSL中RSA常用函数使用举例
- 常用oracle函数使用实例
- 常用struts标签使用举例--html篇(转载)
- 常用struts标签使用举例--logic篇
- 使用C#创建webservice及三种调用方式 (ASP.NETweb编程常用到的27个函数集)
- php常用函数使用示例
- 常用struts标签使用举例--logic篇 (转载)
- OpenSSL 常用函数——证书操作
- C++常用字符串处理函数及使用示例(ASCII)
- JS 操作IE游览器常用函数使用说明
- oracle常用函数使用大全
- ajax 常用函数和类的使用