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.pswp.cn/news/533616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533616.shtml
英文地址,請注明出處:http://en.pswp.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:在讀取程序的…