【问题标题】:Encryption (Rijndael Cipher) With C/C++ in Android NDK在 Android NDK 中使用 C/C++ 加密(Rijndael 密码)
【发布时间】:2015-06-30 08:07:55
【问题描述】:

我想将我的 C#(托管)解密方法转换为 Android NDK、C/C++(无 JAVA)

我看到有加密货币。在 JAVA 方面,但我想远离任何 JNI,而且我还看到有 mcrypt 和 crypt++ 但找不到用于 android 的编译库。

这是我想翻译成 c/c++ 的 C# 示例

    public byte[] DecryptBytes(byte[] encryptedBytes)           
    {
    RijndaelManaged RijndaelCipher = new RijndaelManaged();


            RijndaelCipher.Mode = CipherMode.CBC;

            ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(Bytes32_KEY, Bytes16_IV);

            MemoryStream memoryStream = new MemoryStream(encryptedBytes);
            CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);
            byte[] plainBytes = new byte[encryptedBytes.Length];

            int DecryptedCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length);

            memoryStream.Close();
            cryptoStream.Close();

            return plainBytes;

    };

更新 所以到目前为止我发现的最好的方法是使用openSSL AES,我已经为Android下载了一个预编译的lib,我只是在努力让它与已经发布的示例一起工作,因为这里工作的是c代码示例

void test_enc(){

    int keylength = 256;

    //  // 256bit KEY
        uint8_t key[32] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
            0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};

        //128bit IV
        uint8_t iv[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};


        //input data
        uint8_t input[64] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

    size_t inputslength = 10;
    int x;

    uint8_t *aes_key = key;

    uint8_t *aes_input = input;

    uint8_t *iv_enc = iv;
    uint8_t *iv_dec = iv;

    // buffers for encryption and decryption
    const size_t encslength = ((inputslength + AES_BLOCK_SIZE) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;
    uint8_t *enc_out = (uint8_t*)malloc(sizeof(uint8_t) *encslength);
    uint8_t *dec_out = (uint8_t*)malloc(sizeof(uint8_t) *inputslength);
    memset(enc_out, 0, encslength);
    memset(dec_out, 0, inputslength);

    // so i can do with this aes-cbc-128 aes-cbc-192 aes-cbc-256
    AES_KEY enc_key, dec_key;
    AES_set_encrypt_key(aes_key, keylength, &enc_key);
    AES_cbc_encrypt(input, enc_out, inputslength, &enc_key, iv_enc, AES_ENCRYPT);

    AES_set_decrypt_key(aes_key, keylength, &dec_key);  
    AES_cbc_encrypt(enc_out, dec_out, encslength, &dec_key, iv_dec, AES_DECRYPT);

    LOGI("Before:");
    for(x=0;x<inputslength;x++)
        LOGI("%02x, ", input[x]);

    LOGI("Encrypted:");
    for(x=0;x<encslength;x++)
        LOGI("%02x, ", enc_out[x]);

    LOGI("Decrypted:");
    for(x=0;x<encslength;x++)
        LOGI("%02x, ", dec_out[x]);
};

加密后的字节与c#不一样,然后解密不回输入,我哪里出错了?

【问题讨论】:

  • 我在 C 下找到了几个 AES 的例子,但看不到 IV 会去哪里,然后我发现有人发布了一个为 android 编译的 openSSL AES,还有一个使用 AES 的帖子 link 但是这个例子似乎不起作用!我将发布我必须检查上面的代码的内容

标签: c++ c encryption android-ndk


【解决方案1】:

已解决:

问题是似乎保存 IV 的数组在加密后被更改,因此您需要在解密之前重新设置以获得结果

使用预构建的适用于 Android 的 OpenSSL,您可以在此处找到 OpenSSL-for-Android-Prebuilt

上面的代码只记得在每次调用 AES_cbc_encrypt 之前设置 IV。

【讨论】:

  • 我需要类似的东西来加密,我对 OpenSSL 或 NDK 也不是很有经验。您能否分享一些链接,其中显示了在 JNI 文件夹中为 Android NDK 使用 OpenSSL 库的一些示例?这对我很有帮助。
【解决方案2】:

OpenSSL 是一个相当大的库(如果您关心 APK 大小)

您可以在 C 中使用 Tiny AES(可以与 C++ 一起使用)

我已将其添加到 Android 项目 (CMake)

https://github.com/anonym24/Android-Tiny-AES-NDK

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多