zoukankan      html  css  js  c++  java
  • java和c++中的DES3DESBase64

    首先来看一段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)是DESAES过渡的加密算法(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是一个迭代的对称密钥分组的密码,它可以使用128192256位密钥,并且用128位(16字节)分组加密和解密数据。

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

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

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

  • 相关阅读:
    js重要函数
    js判断是否为空
    checkbox选择框如果被选中value值就可以传过去,没有被选中value就不能穿过去(调试了近一天,坑爹的说)
    js常用点
    常用jdbc操作
    java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 1
    com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 2 无效 待整理
    OOAD和UML
    .net 外部CSS文件不起作用总结
    线程读书笔记
  • 原文地址:https://www.cnblogs.com/snowbook/p/5103455.html
Copyright © 2011-2022 走看看