首先来看一段java中对字符串加解密的代码:

//密钥

private String key = "123456789012345678901234";

//解密过程,先用Base64进行解密,然后再用3DES进行第二次解密,得到明文

public String decryptThreeDESECB(String src) throws Exception {
  DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(charSet));
  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
  SecretKey securekey = keyFactory.generateSecret(dks);
  Cipher cipher = Cipher.getInstance("DESede");
  cipher.init(Cipher.DECRYPT_MODE, securekey);
  byte[] retByte = cipher.doFinal(Base64.decodeBase64(src.getBytes(charSet)));
  return new String(retByte,charSet);
}

//加密过程,先用3DES进行加密,然后再用Base64进行第二次加密输出,得到密文
public String decryptThreeDESECBBYTE(byte[] EncodeByte) throws Exception {
  DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(charSet));
  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
  SecretKey securekey = keyFactory.generateSecret(dks);
  Cipher cipher = Cipher.getInstance("DESede");
  cipher.init(Cipher.DECRYPT_MODE, securekey);
  byte[] retByte = cipher.doFinal(Base64.decodeBase64(src.getBytes(charSet)));
  return new String(retByte,charSet);
}

在java中通过引入相应的库可以轻松实现该功能,而在c++中相应的确没有标准的库给调用,因此还是需要理解一下DES相关的知识,再去实现代码。

我们先来了解一下简单的DES/3DES/AES的区别:

DES

  如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;

  如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。

  在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。

  通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

3DES

  3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法。

  3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。

  设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,

  3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

  3DES解密过程为:P=Dk1((EK2(Dk3(C)))

  K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位。

AES

  AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高。

  用AES加密2000年10月,NIST(美国国家标准和技术协会)宣布通过从15种候选算法中选出的一项新的密匙加密标准。Rijndael被选中成为将来的 AES。Rijndael是在1999年下半年,由研究员Joan Daemen 和 Vincent Rijmen 创建的。AES正日益成为加密各种形式的电子数据的实际标准。

  美国标准与技术研究院(NIST)于2002年5月26日制定了新的高级加密标准(AES)规范。

  AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。

  AES使用几种不同的方法来执行排列和置换运算。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。

  与公共密钥加密使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

了解了相应的知识以后,我们再去写相应的c++代码。我这里有一个写好的和上面java实现功能一样的c++代码,供大家参考。地址为:

http://download.csdn.net/detail/liulong371212/9391330

最新文章

  1. python中paramiko模块的使用
  2. JAVA中读取xls数据方法介绍
  3. 对DataTable里数据进行排序
  4. 检索n以内所有素数
  5. hdu1116回溯N皇后问题
  6. VS2010暂停编译界面
  7. [js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)
  8. C++ IO操作API及注意事项(包含一个日志类的实现)
  9. 修改了SpringBoot的主类名称后,gradle build报错的解决办法
  10. [Swift]LeetCode521. 最长特殊序列 Ⅰ | Longest Uncommon Subsequence I
  11. 数据结构|-用C#实现一个简单的链表
  12. Flash硬件原理
  13. Redis 主从+哨兵+监控 (centos7.2 + redis 3.2.9 )
  14. css字符串转换为类map对象及反转
  15. HTTP 错误 404.17 - Not Found和 HTTP 错误 404.2 - Not Found 解决办法
  16. 使用CefSharp在.Net程序中嵌入Chrome浏览器(八)——Cookie
  17. OAF_OAF控件系列5 - Train的实现(案例)
  18. 机器学习—集成学习(Adaboost)
  19. Solr开发文档(转)
  20. android 侧滑菜单

热门文章

  1. bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组
  2. 在Web API 2 中实现带JSON的Patch请求
  3. Java 注解(Annotation)秒懂,你可以这样学,
  4. model 数据注解
  5. SpringBoot自动配置的实现原理
  6. Python之匿名函数(filter,map,reduce)
  7. ResultSet 结果集
  8. BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)
  9. Python内置函数详解-总结篇
  10. VirtualBox安装Ubuntu搭建js环境的注意事项