下面是一段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);
}
}