[英]Java implementation of C++ encrypt decrypt function(Cryptix toolbox)
嗨,我正在嘗試對2個系統中使用的數據進行加密和解密(一個是C ++,另一個是Java),我從代碼項目中找到了一個Demo項目: 加密這是c ++的加密解密功能,當我實現代碼時可以使用使用功能:
void main()
{
try
{
CRijndael oRijndael;
oRijndael.MakeKey("abcdefghabcdefgh", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16, 16);
char szDataIn[] = "Password12345678";
char szDataOut[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
oRijndael.EncryptBlock(szDataIn, szDataOut);
cout << "[" << szDataIn << "]" << endl;
cout << "[" << szDataOut << "]" << endl;
memset(szDataIn, 0, 16);
oRijndael.DecryptBlock(szDataOut, szDataIn);
cout << "[" << szDataIn << "]" << endl;
}
catch(exception& roException)
{
cout << roException.what() << endl;
}
}
這在控制台中提供了以下輸出:
數據加密結束解密。
誰能幫我或指明正確的方向,以便Java實現對相同的數據進行加密和解密,以獲得相同的結果(在C ++中進行加密,然后在Java中進行解密,在Java ++中使用c ++進行解密)? 在帖子中,他們談論了Cryptix工具包?
提前致謝。
此Java代碼將加密/解密,並產生與編碼為十六進制的示例相同的輸出。 輸出看起來是相同的(應該是),但是要100%確保您需要在C ++示例中對輸出進行十六進制編碼。
請注意,盡管您的示例將僅加密和解密單個塊(16字節)。 如果您想要的還不止這些,則需要使用CRijndael
Encrypt
和Decrypt
方法(而不是EncryptBlock
和DecryptBlock
)。 下面的Java代碼可以同時使用,而無需對其進行修改。
public static void main(String[] args) throws DecoderException, InvalidKeyException,
NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException,
IllegalBlockSizeException, BadPaddingException {
//Hex encoding/decoding done with Apache Codec
byte[] key = "abcdefghabcdefgh".getBytes();
String text = "Password12345678";
byte[] encrypted = encrypt(key, text.getBytes());
byte[] decrypted = decrypt(key, encrypted);
System.out.println("Text: " + text);
System.out.println("Encrypted: " + Hex.encodeHexString(encrypted));
System.out.println("Decrypted: " + new String(decrypted));
}
public static byte[] encrypt(byte[] key, byte[] unencrypted) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException,
IllegalBlockSizeException, BadPaddingException{
//Set up the cipher and encrypt
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));
byte[] encrypted = cipher.doFinal(unencrypted);
return encrypted;
}
public static byte[] decrypt(byte[] key, byte[] encrypted) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException,
IllegalBlockSizeException, BadPaddingException{
//Decrypt the encrypted text
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"));
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
輸出量
Text: Password12345678
Encrypted: 6c7d800fad2bb8593db92847bbbdbeff
Decrypted: Password12345678
提醒您的是,這種加密(ECB,無填充)是高度不安全的,因此您切勿在實際系統中使用它。 您確實應該將CBC與初始化向量和PKCS5填充一起使用。
確保不要直接從char數組導出加密的數據。 使用固定大小的輸出或使用字節緩沖區。 這是強制性的,因為在加密的字符串中,您可能具有字節組合,這些字節組合可以解釋為控制字符,fe \\0
標記。 如果是這樣,使用...<< szDataOut;
輸出打印到文件...<< szDataOut;
可能會損壞您的加密字符串,並且無法被第二個應用程序完整讀取(無論是Java還是c ++)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.