下面是一段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加密算法相关推荐

  1. java 字符串 加密_如何用JAVA实现字符串简单加密解密?

    展开全部 java加密字符串可以使用des加密算法62616964757a686964616fe4b893e5b19e31333363376462,实例如下: package test; import ...

  2. java word 加密_如何通过Java实现加密、解密Word文档

    前言 对一些重要文档,我们为保证其文档内容不被泄露,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件.下面介绍了一种比较简单的方法给Word文件加密以及如何给已加密的Word文件解除密码 ...

  3. java 字符串加密_如何用JAVA实现字符串简单加密解密?

    展开全部 java加密字符串可以使用des加密算法,实例如62616964757a686964616fe59b9ee7ad9431333337616636下: package test; import ...

  4. java交税成型_急~java编程个人所得税计算器

    满意答案 dovelx 2017.01.19 采纳率:56%    等级:12 已帮助:11434人 1234567891011121314151617181920212223242526272829 ...

  5. java pgp加密_基于Java Bouncy Castle的PGP加密解密示例

    # re: 基于Java Bouncy Castle的PGP加密解密示例  回复  更多评论 2016-03-02 10:32 by 毛小龙 对文件进行加密 在测试类里面已经跑通了 抽取出来调用就报这 ...

  6. 树莓派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 ...

  7. java源代码加密+使用proguard混淆java web项目代码+自定义Classloader

    如何保护我们的源代码,实际上,应该有几种方法可以使用:1.使用代码混淆器 2.重载应用服务器的classloader 使用代码混淆器proguard进行代码混淆 1.首先下载proGuard.zip到 ...

  8. 马士兵 java 学习笔记_马士兵java教程笔记1

    ---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...

  9. java 02-cf_cf活动如何设置java环境变量_如何设置java环境变量

    cf助手怎么连接wifi_连接无线网设置 对于刚刚学习java的win7用户来说,首先要学会安装jdk和配置java环境变量,这是学习java的唯一途径,否则编写的代码运行时会出现bug.关于这一点, ...

最新文章

  1. 解决centos4不能使用yum的方法
  2. windows powershell实战指南_【安全研究】powershell在主机中是否存在安全隐患?
  3. binlog日志_MySQL三大日志binlog、redo log和undo log
  4. PDE双曲型方程数值解形式及例题分析
  5. 2010年经典语录,我们全OUT了
  6. php检测php.ini是否配制正确
  7. 持续集成jenkins工具介绍(一)
  8. ndimage.median_filter中值滤去除干扰信号
  9. php修改另一个文件内容,php如何修改文件内容
  10. PRML第三章3.3贝叶斯线性回归
  11. littlevgl教程 Linux,正点原子-手把手教你学LittlevGL
  12. android#boardcast#广播实现强制下线功能
  13. JAVA对excle创建、读取、设置单元格颜色、背景色、跨行跨列
  14. PMO绩效考核的主要维度有哪些?
  15. 【Visual C++】游戏开发笔记二十五 最简化的DirectX 11开发环境的配置
  16. 数据结构约瑟夫环实验报告
  17. Thoughtworks XStream介绍
  18. 【LeetCode】第599题——两个列表的最小索引总和(难度:简单)
  19. 超强linux学习笔记,值得一看(附PDF下载)
  20. 中国历史朝代公元对照简表

热门文章

  1. Spring4.x集成xfire1.26 问题汇总
  2. swing中模态对话框(setModal(true))和显示对话框(setVisible(true))的编写顺序
  3. Super详解(重点)
  4. JavaScript-变量的作用域 、const、let
  5. Java-For循环
  6. 20丨8年哈工程计算机专业录取分数线多少,双一流211大学 哈尔滨工程大学2020年各省各专业录取分数线...
  7. MATLAB灰度级数为1,图像处理 – 在matlab中更改灰度图像中的灰度级数
  8. Python time 模块 - Python零基础入门教程
  9. sql devalop连接mysql_SQL-Mysql表结构操作
  10. form表单图片预览 layui_layui 实现图片上传和预览