在实际开发过程中碰到了一个需要由JAVA加解密而用VC解密阅读的需求。因为算法也无需太复杂,故选择使用DES算法,这个两者都支持的算法。整个加解密的过程与功能很简单。但查阅相关的资料与调试花费了不少时间,下面贴出两段代码样例与大家共享:

JAVA代码:
public class DesSecurity {
    BASE64Encoder encoder;
    BASE64Decoder decoder;
    Cipher enCipher;
    Cipher deCipher;
    /**
     * @param key 加密密钥
     * @param iv 初始化向量
     * @throws Exception
     */
    public DesSecurity(String key, String iv) throws Exception {
        if (key == null) {
            throw new NullPointerException("Parameter is null!");
        }
        initCipher(key.getBytes(), iv.getBytes());
    }
   
    private void initCipher(byte[] secKey, byte[] secIv) throws Exception {
        // 创建MD5散列对象
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 散列密钥
        md.update(secKey);
        // 获得DES密钥
        DESKeySpec   dks   =   new   DESKeySpec(md.digest());
        // 获得DES加密密钥工厂
        SecretKeyFactory   keyFactory   =   SecretKeyFactory.getInstance("DES");
        // 生成加密密钥
        SecretKey   key   =   keyFactory.generateSecret(dks);
        // 创建初始化向量对象
        IvParameterSpec iv = new IvParameterSpec(secIv);
        AlgorithmParameterSpec paramSpec = iv;
        // 为加密算法指定填充方式,创建加密会话对象
        enCipher   =   Cipher.getInstance("DES/CBC/PKCS5Padding");
        // 为加密算法指定填充方式,创建解密会话对象
        deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        // 初始化加解密会话对象
        enCipher.init(Cipher.ENCRYPT_MODE,   key,   paramSpec); 
        deCipher.init(Cipher.DECRYPT_MODE,   key,   paramSpec);
        encoder = new BASE64Encoder();
        decoder = new BASE64Decoder();
    }
/**
 * 加密数据
     * @param data 待加密二进制数据
     * @return 经BASE64编码过的加密数据
     * @throws Exception
     */
    public String encrypt(byte[] data) throws Exception {
        return encoder.encode(enCipher.doFinal(data));
    }
/**
* 解密数据
     * @param data 待解密字符串(经过BASE64编码)
     * @return    解密后的二进制数据
     * @throws Exception
     */
    public byte[] decrypt(String data) throws Exception {  
        return deCipher.doFinal(decoder.decodeBuffer(data));
    }
}
 
VC代码:
// 参数: 
//         [IN]   lpszKey 加密密钥
//         [IN]   lpszIv 初始化向量
DesSecurity::DesSecurity(LPTSTR lpszKey, LPTSTR lpszIv)
{
    if (lpszKey == NULL || lpszIv == NULL) {
       throw "Parameter is null!";
    }
    m_hKey = NULL;
    init(lpszKey, lpszIv);
}
 
DesSecurity::~DesSecurity(void)
{
    // Destroy the session key.
    if(m_hKey != 0) CryptDestroyKey(m_hKey);
 
}
 
 
void DesSecurity::init(LPTSTR lpszKey, LPTSTR lpszIv) {
    HCRYPTPROV hProv;
    HCRYPTHASH hHash;
    TCHAR szDebug[256];
    DWORD dwLength;
    try {
       // 获得密钥容器
       if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0)) {
           sprintf(szDebug, "Error %x during CryptAcquireContext!/n", GetLastError());
           throw szDebug;
       }
       // 创建MD5散列对象
       if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
            sprintf(szDebug, "Error %x during CryptCreateHash!/n", GetLastError());
            throw szDebug;
       }
       // 散列密钥
       dwLength = strlen(lpszKey);
       if(!CryptHashData(hHash, (LPBYTE)lpszKey, dwLength, 0)) {
            sprintf(szDebug, "Error %x during CryptHashData!/n", GetLastError());
            throw szDebug;
       }
       // 创建会话密钥
       if(!CryptDeriveKey(hProv, CALG_DES, hHash, 0, &m_hKey)) {
            sprintf(szDebug, "Error %x during CryptDeriveKey!/n", GetLastError());
            throw szDebug;
       }
       // 设置初始化向量.
       if(!CryptSetKeyParam(m_hKey, KP_IV, (LPBYTE)lpszIv, 0)) {
            sprintf(szDebug, "Error %x during CryptSetKeyParam!/n", GetLastError());
            throw szDebug;
       }
    } catch(LPTSTR lpszDebug) {
       // Destroy the hash object.
       if(hHash != 0) CryptDestroyHash(hHash);
       // Release the provider handle.
       if(hProv != 0) CryptReleaseContext(hProv, 0);
       throw lpszDebug;
    }
 
}
// 
// 功能: 解密数据
// 参数: 
//     [IN]   lpszSrc   待解密数据(BASE64编码)
//     [IN/OUT] lpszDst 存放解密后数据的缓冲区
//     [IN/OUT] pnLen       输入时指缓冲区的长度,输出时指解密后数据的长度
// 返回值:
//     TRUE   解密成功
//     FALSE 解密失败
//
BOOL DesSecurity::Decode(LPTSTR lpszSrc, LPBYTE lpszDst, PINT pnLen) {
    if (lpszSrc == NULL || lpszDst == NULL || pnLen == NULL) {
       SetLastErrorEx(ERROR_INVALID_PARAMETER ,SLE_ERROR);
       return false;
    }
    if (!Base64Decode(lpszSrc, _tcslen(lpszSrc), lpszDst, pnLen))
       return false;
    if (!CryptDecrypt(m_hKey, 0, true, 0, lpszDst, (DWORD*)pnLen))
       return false;
    return true;
}

VC与JAVA DES加密算法互操作相关推荐

  1. java des 加密 单倍长_明明白白使用DES加密算法

    DES加密算法在很多行业都有着非常广泛的应用,对于初学者,开始很容易被ECB.CBC以及计算MAC搞得困惑不已,下面我将一一介绍这几者之间的关系,希望对新人有帮助.为了易于表述,下面所有的密钥及数据都 ...

  2. 实验一 DES加密算法编程实现

    华南理工大学 软件学院 陈春华 (博士) chunhuachen@scut.edu.cn 一. 实验目的 通过使用DES 算法对实验数据进行加密和解密,掌握现代分组密码算法基本原理,熟练掌握DES 算 ...

  3. destools php_php DES加密算法实例分析

    本文实例讲述了php DES加密算法.分享给大家供大家参考,具体如下: yii框架的DES代码 /** *@see Yii CSecurityManager; */ class Des{ public ...

  4. Android与iOS在DES加密算法上的统一

    Java与iOS在DES加密算法上的对应关系如下: Java iOS CBC/PKCS5Padding kCCOptionPKCS7Padding ECB/PKCS5Padding kCCOption ...

  5. Java DES 加密解密

    1.加密的相关概念 1.明文:被隐蔽的消息称作明文(plaintext) 2.密文:隐蔽后的消息称作密文(ciphertext) 3.加密:将明文变换成密文的过程称作加密(encryption) 4. ...

  6. java des解密乱码_des解密不完整,前面几位是乱码的解决办法

    在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码.废了半天劲,终于找到了问题所在. 下面先介绍一下des,了解des的同学可以直接看下面的解决办法. ...

  7. java常用加密算法及MD5的使用

    前言:工作中经常遇到将数据进行各种方式的加密,然后封装到一个自定义的实体类中作为参数进行传输数据.当然这是为了数据在传输过程中的安全保证,不被其他人轻易的就获取到原数据: 首先,加密解密的概念很简单明 ...

  8. DES加密算法原理及代码实现

    目录 一.简要描述 二.名词解释 数据填充 分组加密 算法特点 置换 三.加密运算 1.加密运算流程图 2.初始置换 ​ 3.生成子秘钥 PC-1置换 ​ PC-2置换 4.迭代的过程(f函数) f函 ...

  9. java 的加密算法工具的集合

    哎,公司又要忙点了,然后也就下班回家写点东西,确实现在感觉写写东西是一个好的习惯,即使有些东西是不会的,但是当你在看别人的博客和项目驱动的情况下也会让你懂得很多.公司因为是做第三方支付的所以不得不去涉 ...

最新文章

  1. 应用量化时代 | 微服务架构的服务治理之路
  2. oracle 11gR2 RAC 安装
  3. 【Pytorch神经网络基础理论篇】 07 线性回归 + 基础优化算法
  4. mongodb replicaset shard 集群性能测试
  5. Delphi控件开发浅入深出(三)
  6. Swift的一些问题
  7. JBOSS EAP6.2.0的下载安装、环境变量配置以及部署
  8. java大学实用教程(第四版)_Java大学实用教程(第4版)
  9. 手机刷入其它系统跳过谷歌开机引导,谷歌安全验证
  10. 测试人员的绩效考核,看看你有哪些没做好
  11. centos7安装Memcached
  12. 网易微专业python爬虫工程师一期多久_有木有人上过网易云课堂的 Python Web 微专业,怎么样?...
  13. [kubernetes]-Pod无法通过 Service IP 访问自身
  14. IDEA萌新快速入手教程
  15. 机器学习实战——kaggle 泰坦尼克号生存预测——六种算法模型实现与比较
  16. c++ txt文件的读写及乱码问题解决
  17. (50)Linux命令【nl命令】
  18. 服务器显示free怎么回事,free云服务器
  19. input类型为number时,去掉上下箭头
  20. 行测:判断推理(图形推理)

热门文章

  1. statfs函数获取大容量磁盘信息速度慢的解决过程
  2. 诊断Oracle 服从成绩
  3. C# 怎样判断 datagridview 中的checkbox列是否被选中
  4. 以前看书时记得一些笔记(二),很早了,现在再看都有些看不懂了
  5. 浅谈C#中virtual和abstract的区别
  6. Halcon/MFC混合编程入门
  7. excel表格vlookup函数怎么用_只会Vlookup函数Out了!Excel所有查找公式全在这儿(共16大类)...
  8. 黑白块游戏java代码_用java做的一个小游戏—黑白反斗棋(适合菜鸟)
  9. 自定义标签的使用jsp实例_JSP自定义标签示例教程
  10. 熊猫read_csv()–将CSV文件读取到DataFrame