java - .NET AES 加密和 Android 解密

标签 java c# android encryption cryptography

我使用以下代码在 .NET 中使用 AES 加密 GUID 字符串。

        // Decode the challenge bytes from base 64
        byte[] challengeBytes = Base64.decode(challenge, Base64.NO_WRAP);

        ICryptoTransform encryptor = aes.CreateEncryptor(key, initializationVector);

        MemoryStream memoryStream = new MemoryStream();

        // Create a stream to encrypt our data
        CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
        cryptoStream.Write(challenge, 0, challenge.Length);
        cryptoStream.FlushFinalBlock();

        byte[] encryptedChallengeBytes = memoryStream.ToArray();

        // Clean up
        memoryStream.Close();
        cryptoStream.Close();

        // Convert to a base 64 string
        return Convert.ToBase64String(encryptedChallengeBytes, Base64FormattingOptions.None);

然后在 Android 中我使用以下代码进行解密。

    Cipher aes = Cipher.getInstance("AES/CBC/PKCS7Padding");

    SecretKey key = new SecretKeySpec(keyBytes, "AES");

    // Initialize the cipher
    aes.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(initializationVector));

    guid = new String(aes.doFinal(challengeBytes));

    return guid;

我已经完成了各种调试,IV key 挑战字节在两个平台上完全相同。我逐字节查看了它们,它们都很好。它们唯一的区别是,在 .NET 上,它们的范围是 0-255,在 Android 上,它们的范围是 -128 到 127。现在我不确定这是否是问题,但我只是假设 2 的补码不应该影响该算法的 Java 实现,因为在我看来那是愚蠢的。

我在尝试解密时遇到此异常

03-01 20:31:48.313  12886-12982/com.danielwardin.social I/SOCIAL﹕ eneter.messaging.messagingsystems.simplemessagingsystembase.internal.DefaultDuplexOutputChannel@2474079b
03-01 20:32:50.157  12886-12988/com.danielwardin.social W/System.err﹕ javax.crypto.BadPaddingException: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
03-01 20:32:50.158  12886-12988/com.danielwardin.social W/System.err﹕ at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method)
03-01 20:32:50.187  12886-12988/com.danielwardin.social W/System.err﹕ at com.android.org.conscrypt.OpenSSLCipher.doFinalInternal(OpenSSLCipher.java:430)
03-01 20:32:50.188  12886-12988/com.danielwardin.social W/System.err﹕ at com.android.org.conscrypt.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:466)
03-01 20:32:50.188  12886-12988/com.danielwardin.social W/System.err﹕ at javax.crypto.Cipher.doFinal(Cipher.java:1340)

这是导致问题的线路

    guid = new String(aes.doFinal(challengeBytes));

challengebytes 数组始终为 48 个字节,也是 16 的倍数,因此我不知道为什么会收到 BadPaddingException

我查遍了 Google 并调整了大约 4 个小时,我的大脑现在已经死了。

有什么想法吗?

最佳答案

PKCS7Padding 是一种始终填充的填充方案。当明文是 block 长度的倍数时,会添加一个附加 block ,并将每个字节设置为 block 长度的值(模 256)。这消除了歧义:如果纯文本的最后一个字节是 01 怎么办?它看起来像 1 个字节的填充并被删除。

因此,只需从用 Java 构造密码的位置删除它即可,因为您实际上并未使用填充方案:

Cipher aes = Cipher.getInstance("AES/CBC/NoPadding");

--编辑: 抱歉,我混淆了语义。查看更多信息here .

关于java - .NET AES 加密和 Android 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28798938/

相关文章:

c# - PM 给我 ERROR : Type is not resolved for member. .on any migration command

android - 获取带有姓名的 Facebook 好友列表

java - 使用 Apache commons 文件上传 API 在 Jsp 中上传多个文件

java - 创建 mapreduce Web 应用程序的方法

c# - 这个单例实现是线程安全的吗 - 检查代码

c# - 列表框选择模式在 WPF 中不起作用

android - on"XYZ"回调事件如何工作?

android - Android ICS 上的 ACCESS_NETWORK_STATE 权限

java - 任务栏进度

java - MySQL 不正确的日期值 : null