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 = "其中一個參數(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言的程序结构语序,第3章 C语序结
- 下一篇: AJAX框架衣柜内部布局,最合理的衣柜