簡體   English   中英

Java實現的C ++加密解密功能(Cryptix工具箱)

[英]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 EncryptDecrypt方法(而不是EncryptBlockDecryptBlock )。 下面的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM