VC与JAVA DES加密算法互操作
在实际开发过程中碰到了一个需要由JAVA加解密而用VC解密阅读的需求。因为算法也无需太复杂,故选择使用DES算法,这个两者都支持的算法。整个加解密的过程与功能很简单。但查阅相关的资料与调试花费了不少时间,下面贴出两段代码样例与大家共享:
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加密算法互操作相关推荐
- java des 加密 单倍长_明明白白使用DES加密算法
DES加密算法在很多行业都有着非常广泛的应用,对于初学者,开始很容易被ECB.CBC以及计算MAC搞得困惑不已,下面我将一一介绍这几者之间的关系,希望对新人有帮助.为了易于表述,下面所有的密钥及数据都 ...
- 实验一 DES加密算法编程实现
华南理工大学 软件学院 陈春华 (博士) chunhuachen@scut.edu.cn 一. 实验目的 通过使用DES 算法对实验数据进行加密和解密,掌握现代分组密码算法基本原理,熟练掌握DES 算 ...
- destools php_php DES加密算法实例分析
本文实例讲述了php DES加密算法.分享给大家供大家参考,具体如下: yii框架的DES代码 /** *@see Yii CSecurityManager; */ class Des{ public ...
- Android与iOS在DES加密算法上的统一
Java与iOS在DES加密算法上的对应关系如下: Java iOS CBC/PKCS5Padding kCCOptionPKCS7Padding ECB/PKCS5Padding kCCOption ...
- Java DES 加密解密
1.加密的相关概念 1.明文:被隐蔽的消息称作明文(plaintext) 2.密文:隐蔽后的消息称作密文(ciphertext) 3.加密:将明文变换成密文的过程称作加密(encryption) 4. ...
- java des解密乱码_des解密不完整,前面几位是乱码的解决办法
在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码.废了半天劲,终于找到了问题所在. 下面先介绍一下des,了解des的同学可以直接看下面的解决办法. ...
- java常用加密算法及MD5的使用
前言:工作中经常遇到将数据进行各种方式的加密,然后封装到一个自定义的实体类中作为参数进行传输数据.当然这是为了数据在传输过程中的安全保证,不被其他人轻易的就获取到原数据: 首先,加密解密的概念很简单明 ...
- DES加密算法原理及代码实现
目录 一.简要描述 二.名词解释 数据填充 分组加密 算法特点 置换 三.加密运算 1.加密运算流程图 2.初始置换 3.生成子秘钥 PC-1置换 PC-2置换 4.迭代的过程(f函数) f函 ...
- java 的加密算法工具的集合
哎,公司又要忙点了,然后也就下班回家写点东西,确实现在感觉写写东西是一个好的习惯,即使有些东西是不会的,但是当你在看别人的博客和项目驱动的情况下也会让你懂得很多.公司因为是做第三方支付的所以不得不去涉 ...
最新文章
- 应用量化时代 | 微服务架构的服务治理之路
- oracle 11gR2 RAC 安装
- 【Pytorch神经网络基础理论篇】 07 线性回归 + 基础优化算法
- mongodb replicaset shard 集群性能测试
- Delphi控件开发浅入深出(三)
- Swift的一些问题
- JBOSS EAP6.2.0的下载安装、环境变量配置以及部署
- java大学实用教程(第四版)_Java大学实用教程(第4版)
- 手机刷入其它系统跳过谷歌开机引导,谷歌安全验证
- 测试人员的绩效考核,看看你有哪些没做好
- centos7安装Memcached
- 网易微专业python爬虫工程师一期多久_有木有人上过网易云课堂的 Python Web 微专业,怎么样?...
- [kubernetes]-Pod无法通过 Service IP 访问自身
- IDEA萌新快速入手教程
- 机器学习实战——kaggle 泰坦尼克号生存预测——六种算法模型实现与比较
- c++ txt文件的读写及乱码问题解决
- (50)Linux命令【nl命令】
- 服务器显示free怎么回事,free云服务器
- input类型为number时,去掉上下箭头
- 行测:判断推理(图形推理)
热门文章
- statfs函数获取大容量磁盘信息速度慢的解决过程
- 诊断Oracle 服从成绩
- C# 怎样判断 datagridview 中的checkbox列是否被选中
- 以前看书时记得一些笔记(二),很早了,现在再看都有些看不懂了
- 浅谈C#中virtual和abstract的区别
- Halcon/MFC混合编程入门
- excel表格vlookup函数怎么用_只会Vlookup函数Out了!Excel所有查找公式全在这儿(共16大类)...
- 黑白块游戏java代码_用java做的一个小游戏—黑白反斗棋(适合菜鸟)
- 自定义标签的使用jsp实例_JSP自定义标签示例教程
- 熊猫read_csv()–将CSV文件读取到DataFrame