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);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux配置usb主从_杂集:浅谈关于Mongodb数据库主从复制

Linux下Mongodb数据库主从复制配置Mongodb的三种集群搭建的方式:Master-Slaver:主从[目前被副本集取代]。Replica Set:副本集。Sharding:切片。Mongodb单实例缺点:适合简易开发时使用,生产使用不行&#xf…

java读取邮箱附件_使用javamail获取附件内容

我正在使用javamail来自动化一些电子邮件处理。使用javamail获取附件内容我设法连接到pop3服务器并获取消息。其中一些包含附件。根据邮件标题,我可以“预测”我需要获取的附件的文件名。但我无法得到它的内容:(我有一个函数public byte[] searchForContent(Part pa…

高斯拟合 vc++代码_NMA2020W1 极大似然法模型拟合与bootstrap

常见的线性模型: 求解方式有两种,一种是计算均方误差(MSE),使得均方误差最小。图1找到梯度为零的点即可。而之前一直比较模糊的最大似然法也比较清楚了。一般线性模型,我们假定误差项是符合高斯分布的&…

java文件快速扫描仪_Java扫描仪具有示例的NextNextShort()方法

扫描仪类hasNextShort()方法语法:public boolean hasNextShort();public boolean hasNextShort(int rad);hasNextShort()方法在java.util包中可用。hasNextShort()方法用于检查此扫描程序在其输入中是否具有下一个标记,是否可以将其作为隐式基数中的shor…

python sqlite并发处理_python sqlite大数据 处理

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

java sax xml文件解析_java解析xml文件-DOM/SAX

java解析xml文件的两种方式1:DOM原理:把整个文档加载到内存,转化成dom树,之后应用程序可以随机的访问dom树的任何数据,灵活 快,但消耗内存一个简单的xml使用java解析//builder工厂DocumentBuilderFactory f…

python现有两个磁盘文件a和b_有两个磁盘文件A和B,各存放一行字母,今要求把这两个文件中的信息合并,输出到一个新文件C中。...

首先,在.cpp所在的文件夹下建立A.txt与B.txt。向其中输入字母。#include#include#includeint main(){FILE *a,*b,*c;char ch[100],outfile[10];int i0,n;void paixu(char a[100],int n);if((afopen("A.txt","r"))NULL){printf("Cant open …

python 远程控制_用 Python 远程控制你的电脑

用 Python 远程控制你的电脑一、前言很多时候我们有这种需求,因为程序运行比较耗时,但是我们没有足够的时间等待。这个时候我们就可以用 Python 做一个远程控制电脑的小工具,实现远程控制电脑。当然,我们能做的操作十分有限&#…

摄像头图像分析目标物体大小位置_一文读懂图像定位及跟踪技术

文 | 传感器技术在科学技术日新月异的今天,人们对机器设备的智能性、自主性要求也越来越高,希望其完全替代人的角色,把人们从繁重、危险的工作任务中解脱出来,而能否像人一样具有感知周围环境的能力已成为设备实现智能化自主化的关…

java 相对路径获取_在java项目中通过相对路径获取资源的方式

1.可以通过 类名.class.getResource方法获取或者getSystemResource2.可以通过当前线程 Thread.currentThread().getContextClassLoader().getResource获取public class TestDemo {public static void main(String[] args) throws FileNotFoundException, IOException {Properti…

python循环嵌套的外循环必须完全包含内循环_Python:循环与嵌套循环实现规律数列...

很多人觉得编程很难,其实换个想法,这就是个用来解决问题的工具,我们为了解决实际问题而来学习和使用编程,这样编程学习有了目的性,动力会更强。就像现在十分热门的Python技术,就是人工智能领域所需求的&…

python爬取正确但不出文件_使用BeautifulSoup进行Python抓取时不显示所有行

我是美容小组的新手。我试图从ESPN Fantasy Basketball Standings中获取“Season Stats”表,但并不是返回所有行。经过一番研究,我认为这可能是一个问题html.parser,所以我用了lxml。我得到了同样的结果。如果有人能告诉我如何得到所有球队的…

pat乙级相当于什么水平_雅思6.5是什么水平?相当于托福多少分?

雅思和托福是当前社会中非母语人士的主流英语水平测试。准备出国留学的学生对这两项考试并不陌生。对于一些学生来说,仅靠雅思成绩并不足以申请他们最喜欢的学校。特别是对于申请北美院校的学生,托福成绩是申请时提交语言成绩的优先考虑事项。那么&#…

java时间方法_JAVA处理日期时间常用方法

转载JAVA处理日期时间常用方法:1.java.util.CalendarCalendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可…

python气象_Python 在气象上的应用

Python 在气象上的应用0.7892019.03.15 23:19:31字数 913阅读 1,024为什么选择python功能齐全的编程语言,真正面向对象喜欢可读的代码出版质量图绘制轻松读/写netcdf和grib数据轻松使用Fortran / C / C 广泛的库支持数字和非数字工作科学计算1.Numpy  Numpy是pyth…

双飞翼布局内容不换行_web前端入门到实战:圣杯布局和双飞翼布局

稍微了解前端的人都知道,圣杯布局和双飞翼布局是前端面试时必问的问题,因为它既能体现你懂HTML结构又能体现出你对DIVCSS布局的掌握,毕竟我们学习CSS主要就是为了更好地布局带来最好的用户体验嘛~事实上,圣杯布局其实和…

java 去掉 t_关于Java:在LocalDateTime中不能删除“ T”

这是问题所在:GetMapping("/main/search")public String search (RequestParam String departure,RequestParam String arrival,RequestParam String departureTime,Model model) {DateTimeFormatter formatter DateTimeFormatter.ofPattern("yyyy-…

数据结构知识点总结_大牛带你学 | 考研数据结构中线性表中顺序结构的知识点总结...

前言我们都知道,数据结构中逻辑结构可以划分为线性结构(线性表)与非线性结构两大类。而存储结构指的是数据元素在计算机中的存储及其逻辑关系的表现,也就是在计算机当中对逻辑结构的表示。线性表的存储结构主要有顺序结构和链式结构两种实现形式。本文主…

java矩形翻转_如何判断一个点在旋转后的矩形中

前言最近在做的一款游戏中,用到点与旋转矩形的判定来获得一个选中的物体。在此做个记录如图所示,黄色的颜料屏是旋转的,如果不做处理直接判断点是否在矩形中,那么点击红点的位置会判定为选中物体。显然这是不对的。如果物体没有旋…

python中用函数设计栈的括号匹配问题_数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题...

算法数据结构数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题在平时写程序当中,我们会经常遇到程序当中括号的匹配问题,也就是在程序当中左括号的数量和右括号的数量必须相等。如果不相等的话则程序必然会报错。Hint:在读取程序的…