日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java rc2加密_急求java RC2加密算法

發(fā)布時間:2025/3/8 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java rc2加密_急求java RC2加密算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

下面是一段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 = "其中一個參數(shù)是非法句柄";

break;

case NTE_BAD_ALGID:

ErrMsg = "不支持的加密算法";

break;

case NTE_BAD_DATA:

ErrMsg = "解密的數(shù)據(jù)非法";

break;

case NTE_BAD_FLAGS:

ErrMsg = "標(biāo)識參數(shù)不為0";

break;

case NTE_BAD_HASH:

ErrMsg = "哈希參數(shù)非法";

break;

case NTE_BAD_KEY:

ErrMsg = "密鑰是非法句柄";

break;

case NTE_BAD_LEN:

ErrMsg = "解密數(shù)據(jù)內(nèi)存太小";

break;

case NTE_BAD_UID:

ErrMsg = "找不到CSP上下文";

break;

case NTE_DOUBLE_ENCRYPT:

ErrMsg = "應(yīng)用企圖解密已經(jīng)解密的數(shù)據(jù)";

break;

case NTE_FAIL:

ErrMsg = "程序由于未知原因結(jié)束";

break;

default:

ErrMsg = "未知錯誤";

}

return ErrMsg;

}

//加密失敗時返回失敗描述

AnsiString QSBEncryptRc2::GetEncrytErrMsg()

{

int ErrorCode;

AnsiString ErrMsg;

ErrorCode = GetLastError();

switch( ErrorCode )

{

case ERROR_INVALID_HANDLE:

ErrMsg = "其中一個參數(shù)是非法句柄";

break;

case ERROR_INVALID_PARAMETER:

ErrMsg = "非法參數(shù)";

break;

case NTE_BAD_ALGID:

ErrMsg = "不支持的加密算法";

break;

case NTE_BAD_DATA:

ErrMsg = "解密的數(shù)據(jù)非法";

break;

case NTE_BAD_FLAGS:

ErrMsg = "標(biāo)識參數(shù)不為0";

break;

case NTE_BAD_HASH:

ErrMsg = "哈希參數(shù)非法";

break;

case NTE_BAD_KEY:

ErrMsg = "密鑰是非法句柄";

break;

case NTE_BAD_LEN:

ErrMsg = "解密數(shù)據(jù)內(nèi)存太小";

break;

case NTE_BAD_UID:

ErrMsg = "找不到CSP上下文";

break;

case NTE_DOUBLE_ENCRYPT:

ErrMsg = "應(yīng)用企圖加密已經(jīng)加密的數(shù)據(jù)";

break;

case NTE_NO_MEMORY:

ErrMsg = "內(nèi)存不足";

break;

case NTE_FAIL:

ErrMsg = "程序由于未知原因結(jié)束";

break;

default:

ErrMsg = "未知錯誤";

}

return ErrMsg;

}

//加密數(shù)據(jù)

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不存在,則重新創(chuàng)建一個

if( GetLastError() == (DWORD)NTE_BAD_KEYSET )

{

if(!CryptAcquireContext(&hProv, TEXT("DingXinKey"), 0, PROV_RSA_FULL,

CRYPT_NEWKEYSET))

throw QSBException(003,"創(chuàng)建KEY CONTAINER失敗");

}

else

throw QSBException(003,"連接CSP失敗");

}

//序列化密碼

if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))

throw QSBException(003,"創(chuàng)建序列對象失敗");

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,"創(chuàng)建密鑰失敗");

//加密文件

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

}

}

//解密數(shù)據(jù)

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不存在,則重新創(chuàng)建一個

if( GetLastError() == (DWORD)NTE_BAD_KEYSET )

{

if(!CryptAcquireContext(&hProv, TEXT("DingXinKey"), 0, PROV_RSA_FULL,

CRYPT_NEWKEYSET))

throw QSBException(003,"創(chuàng)建KEY CONTAINER失敗");

}

else

throw QSBException(003,"連接CSP失敗");

}

//序列化密碼

if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))

throw QSBException(003,"創(chuàng)建序列對象失敗");

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,"創(chuàng)建密鑰失敗");

//解密文件

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("解密數(shù)據(jù)失敗:%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);

}

}

總結(jié)

以上是生活随笔為你收集整理的java rc2加密_急求java RC2加密算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。