java rc2加密_急求java RC2加密算法
下面是一段C++ RC2加密 要求要用java 重写 能互相加密解密
QSBEncryptRc2::QSBEncryptRc2()
{
EncryKey = "DingXin Communication Key 20080613";
}
//解密失败时返回失败描述
AnsiString QSBEncryptRc2::GetDecryptErrMsg()
{
int ErrorCode;
AnsiString ErrMsg;
ErrorCode = GetLastError();
switch( ErrorCode )
{
case ERROR_INVALID_HANDLE:
ErrMsg = "其中一个参数是非法句柄";
break;
case NTE_BAD_ALGID:
ErrMsg = "不支持的加密算法";
break;
case NTE_BAD_DATA:
ErrMsg = "解密的数据非法";
break;
case NTE_BAD_FLAGS:
ErrMsg = "标识参数不为0";
break;
case NTE_BAD_HASH:
ErrMsg = "哈希参数非法";
break;
case NTE_BAD_KEY:
ErrMsg = "密钥是非法句柄";
break;
case NTE_BAD_LEN:
ErrMsg = "解密数据内存太小";
break;
case NTE_BAD_UID:
ErrMsg = "找不到CSP上下文";
break;
case NTE_DOUBLE_ENCRYPT:
ErrMsg = "应用企图解密已经解密的数据";
break;
case NTE_FAIL:
ErrMsg = "程序由于未知原因结束";
break;
default:
ErrMsg = "未知错误";
}
return ErrMsg;
}
//加密失败时返回失败描述
AnsiString QSBEncryptRc2::GetEncrytErrMsg()
{
int ErrorCode;
AnsiString ErrMsg;
ErrorCode = GetLastError();
switch( ErrorCode )
{
case ERROR_INVALID_HANDLE:
ErrMsg = "其中一个参数是非法句柄";
break;
case ERROR_INVALID_PARAMETER:
ErrMsg = "非法参数";
break;
case NTE_BAD_ALGID:
ErrMsg = "不支持的加密算法";
break;
case NTE_BAD_DATA:
ErrMsg = "解密的数据非法";
break;
case NTE_BAD_FLAGS:
ErrMsg = "标识参数不为0";
break;
case NTE_BAD_HASH:
ErrMsg = "哈希参数非法";
break;
case NTE_BAD_KEY:
ErrMsg = "密钥是非法句柄";
break;
case NTE_BAD_LEN:
ErrMsg = "解密数据内存太小";
break;
case NTE_BAD_UID:
ErrMsg = "找不到CSP上下文";
break;
case NTE_DOUBLE_ENCRYPT:
ErrMsg = "应用企图加密已经加密的数据";
break;
case NTE_NO_MEMORY:
ErrMsg = "内存不足";
break;
case NTE_FAIL:
ErrMsg = "程序由于未知原因结束";
break;
default:
ErrMsg = "未知错误";
}
return ErrMsg;
}
//加密数据
void QSBEncryptRc2::EncryptData(QSBBlob &inData,QSBBlob &outData)
{
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HCRYPTKEY hKey = 0;
DWORD dwCurrLen,dwLength;
BYTE pbBuffer[BUFFER_SIZE];
DWORD dwCount;
int eof;
const char *ptr;
DWORD nLen;
DWORD nEncryCount;
AnsiString ErrMsg;
try
{
//连接CSP
if(!CryptAcquireContext(&hProv, TEXT("DingXinKey"), 0, PROV_RSA_FULL, 0))
{
//如KEY CONTAINER不存在,则重新创建一个
if( GetLastError() == (DWORD)NTE_BAD_KEYSET )
{
if(!CryptAcquireContext(&hProv, TEXT("DingXinKey"), 0, PROV_RSA_FULL,
CRYPT_NEWKEYSET))
throw QSBException(003,"创建KEY CONTAINER失败");
}
else
throw QSBException(003,"连接CSP失败");
}
//序列化密码
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
throw QSBException(003,"创建序列对象失败");
dwLength = strlen(EncryKey.c_str());
if(!CryptHashData(hHash, (BYTE *)EncryKey.c_str(), dwLength, 0))
throw QSBException(003,"序列化密码失败");
if(!CryptDeriveKey(hProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey))
throw QSBException(003,"创建密钥失败");
//加密文件
outData.ClearContent();
ptr = inData.GetBlobPtr();
nLen = inData.GetBlobLength();
dwCurrLen = 0;
do
{
if( nLen-dwCurrLen>BLOCK_SIZE )
{
memcpy(pbBuffer,ptr+dwCurrLen,BLOCK_SIZE );
eof = false;
nEncryCount=BLOCK_SIZE;
}
else
{
memcpy(pbBuffer,ptr+dwCurrLen,nLen-dwCurrLen );
eof = true;
nEncryCount=nLen-dwCurrLen;
}
dwCount = nEncryCount;
if(!CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount,BUFFER_SIZE))
{
ErrMsg.sprintf("加密失败:%s",GetEncrytErrMsg().c_str() );
throw QSBException(003,ErrMsg.c_str() );
}
outData.AppendBlobContent(pbBuffer,dwCount);
dwCurrLen += nEncryCount;
}
while(dwCurrLen
}
__finally
{
if(hHash != 0)
CryptDestroyHash(hHash);
if(hKey != 0)
CryptDestroyKey(hKey);
if(hProv != 0)
CryptReleaseContext(hProv,0);
}
}
//解密数据
void QSBEncryptRc2::DecryptData(QSBBlob &inData,QSBBlob &outData)
{
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HCRYPTKEY hKey = 0;
DWORD dwCurrLen,dwLength;
BYTE pbBuffer[BUFFER_SIZE];
DWORD dwCount;
int eof;
const char *ptr;
DWORD nLen;
DWORD nDecryCount;
AnsiString ErrMsg;
try
{
//连接CSP
if(!CryptAcquireContext(&hProv, TEXT("DingXinKey"), 0, PROV_RSA_FULL, 0))
{
//如KEY CONTAINER不存在,则重新创建一个
if( GetLastError() == (DWORD)NTE_BAD_KEYSET )
{
if(!CryptAcquireContext(&hProv, TEXT("DingXinKey"), 0, PROV_RSA_FULL,
CRYPT_NEWKEYSET))
throw QSBException(003,"创建KEY CONTAINER失败");
}
else
throw QSBException(003,"连接CSP失败");
}
//序列化密码
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
throw QSBException(003,"创建序列对象失败");
dwLength = strlen(EncryKey.c_str());
if(!CryptHashData(hHash, (BYTE *)EncryKey.c_str(), dwLength, 0))
throw QSBException(003,"序列化密码失败");
if(!CryptDeriveKey(hProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey))
throw QSBException(003,"创建密钥失败");
//解密文件
outData.ClearContent();
ptr = inData.GetBlobPtr();
nLen = inData.GetBlobLength();
dwCurrLen = 0;
do
{
if( nLen-dwCurrLen>BLOCK_SIZE )
{
memcpy(pbBuffer,ptr+dwCurrLen,BLOCK_SIZE );
eof = false;
nDecryCount=BLOCK_SIZE;
}
else
{
memcpy(pbBuffer,ptr+dwCurrLen,nLen-dwCurrLen );
eof = true;
nDecryCount=nLen-dwCurrLen;
}
dwCount = nDecryCount;
if(!CryptDecrypt(hKey, 0, eof, 0, pbBuffer, &dwCount))
{
ErrMsg.sprintf("解密数据失败:%s",GetDecryptErrMsg().c_str());
throw QSBException(003,ErrMsg.c_str());
}
outData.AppendBlobContent(pbBuffer,dwCount);
dwCurrLen += nDecryCount;
}
while(dwCurrLen
}
__finally
{
if(hHash != 0)
CryptDestroyHash(hHash);
if(hKey != 0)
CryptDestroyKey(hKey);
if(hProv != 0)
CryptReleaseContext(hProv,0);
}
}
java rc2加密_急求java RC2加密算法相关推荐
- java 字符串 加密_如何用JAVA实现字符串简单加密解密?
展开全部 java加密字符串可以使用des加密算法62616964757a686964616fe4b893e5b19e31333363376462,实例如下: package test; import ...
- java word 加密_如何通过Java实现加密、解密Word文档
前言 对一些重要文档,我们为保证其文档内容不被泄露,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件.下面介绍了一种比较简单的方法给Word文件加密以及如何给已加密的Word文件解除密码 ...
- java 字符串加密_如何用JAVA实现字符串简单加密解密?
展开全部 java加密字符串可以使用des加密算法,实例如62616964757a686964616fe59b9ee7ad9431333337616636下: package test; import ...
- java交税成型_急~java编程个人所得税计算器
满意答案 dovelx 2017.01.19 采纳率:56% 等级:12 已帮助:11434人 1234567891011121314151617181920212223242526272829 ...
- java pgp加密_基于Java Bouncy Castle的PGP加密解密示例
# re: 基于Java Bouncy Castle的PGP加密解密示例 回复 更多评论 2016-03-02 10:32 by 毛小龙 对文件进行加密 在测试类里面已经跑通了 抽取出来调用就报这 ...
- 树莓派Java程序运行_树莓派上Java程序作为linux服务并开机自动启动
http://www.iigrowing.cn/shu_mei_pai_shang_java_cheng_xu_zuo_wei_linux_fu_wu_bing_kai_ji_zi_dong_qi_d ...
- java源代码加密+使用proguard混淆java web项目代码+自定义Classloader
如何保护我们的源代码,实际上,应该有几种方法可以使用:1.使用代码混淆器 2.重载应用服务器的classloader 使用代码混淆器proguard进行代码混淆 1.首先下载proGuard.zip到 ...
- 马士兵 java 学习笔记_马士兵java教程笔记1
---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...
- java 02-cf_cf活动如何设置java环境变量_如何设置java环境变量
cf助手怎么连接wifi_连接无线网设置 对于刚刚学习java的win7用户来说,首先要学会安装jdk和配置java环境变量,这是学习java的唯一途径,否则编写的代码运行时会出现bug.关于这一点, ...
最新文章
- 解决centos4不能使用yum的方法
- windows powershell实战指南_【安全研究】powershell在主机中是否存在安全隐患?
- binlog日志_MySQL三大日志binlog、redo log和undo log
- PDE双曲型方程数值解形式及例题分析
- 2010年经典语录,我们全OUT了
- php检测php.ini是否配制正确
- 持续集成jenkins工具介绍(一)
- ndimage.median_filter中值滤去除干扰信号
- php修改另一个文件内容,php如何修改文件内容
- PRML第三章3.3贝叶斯线性回归
- littlevgl教程 Linux,正点原子-手把手教你学LittlevGL
- android#boardcast#广播实现强制下线功能
- JAVA对excle创建、读取、设置单元格颜色、背景色、跨行跨列
- PMO绩效考核的主要维度有哪些?
- 【Visual C++】游戏开发笔记二十五 最简化的DirectX 11开发环境的配置
- 数据结构约瑟夫环实验报告
- Thoughtworks XStream介绍
- 【LeetCode】第599题——两个列表的最小索引总和(难度:简单)
- 超强linux学习笔记,值得一看(附PDF下载)
- 中国历史朝代公元对照简表
热门文章
- Spring4.x集成xfire1.26 问题汇总
- swing中模态对话框(setModal(true))和显示对话框(setVisible(true))的编写顺序
- Super详解(重点)
- JavaScript-变量的作用域 、const、let
- Java-For循环
- 20丨8年哈工程计算机专业录取分数线多少,双一流211大学 哈尔滨工程大学2020年各省各专业录取分数线...
- MATLAB灰度级数为1,图像处理 – 在matlab中更改灰度图像中的灰度级数
- Python time 模块 - Python零基础入门教程
- sql devalop连接mysql_SQL-Mysql表结构操作
- form表单图片预览 layui_layui 实现图片上传和预览