所有类型的Android设备均可使用AES / CBC / PKCS5Padding加密解密算法和SHA-1哈希算法吗

Cheok Yan Cheng

我曾尝试在Nexus 5中运行以下AES / CBC / PKCS5Padding加密和解密代码,并将SHA-1作为密钥生成。它到目前为止运行良好。

但是,我唯一关心的是,在所有类型的Android设备上都可以使用AES / CBC / PKCS5Padding加密解密算法和SHA-1哈希算法吗?

以下代码是否有可能无法在某些Android设备上运行?如果是这样,是否有任何后备计划?

AES / CBC / PKCS5填充

// http://stackoverflow.com/questions/3451670/java-aes-and-using-my-own-key
public static byte[] generateKey(String key) throws GeneralSecurityException, UnsupportedEncodingException {
    byte[] binary = key.getBytes("UTF-8");
    MessageDigest sha = MessageDigest.getInstance("SHA-1");
    binary = sha.digest(binary);
    // Use only first 128 bit.
    binary = Arrays.copyOf(binary, 16);
    return binary;
}

// http://stackoverflow.com/questions/17322002/what-causes-the-error-java-security-invalidkeyexception-parameters-missing
public static String encrypt(byte[] key, String value) throws GeneralSecurityException {
    // Argument validation.
    if (key.length != 16) {
        throw new IllegalArgumentException("Invalid key size.");
    }

    // Setup AES tool.
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));

    // Do the job with AES tool.
    byte[] original = value.getBytes(Charset.forName("UTF-8"));
    byte[] binary = cipher.doFinal(original);
    return Base64.encodeToString(binary, Base64.DEFAULT);
}

// // http://stackoverflow.com/questions/17322002/what-causes-the-error-java-security-invalidkeyexception-parameters-missing
public static String decrypt(byte[] key, String encrypted) throws GeneralSecurityException {
    // Argument validation.
    if (key.length != 16) {
        throw new IllegalArgumentException("Invalid key size.");
    }

    // Setup AES tool.
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));

    // Do the job with AES tool.
    byte[] binary = Base64.decode(encrypted, Base64.DEFAULT);
    byte[] original = cipher.doFinal(binary);
    return new String(original, Charset.forName("UTF-8"));
}

用法

byte[] key = generateKey("my secret key");
String ciphertext = encrypt(key, "my plain content");
String plainContent = decrypt(key, ciphertext);
马丁·波德威斯

不,它不可能极端地失败。Android API源自Java API。"AES/CBC/PKCS5Padding"自版本1.4起,Java API就包含了

至于"SHA-1",这是一个更老的算法,自从开始就已经受支持。

当心不要使用"PKCS7Padding"代替。Java"PKCS5Padding"用作替代,"PKCS7Padding"即使含义相同支持也可能是粗略的。


请注意,您应该使用基于密码的加密(PBE)代替AES / CBC和SHA-1。特别是将SHA-1用作密钥派生方法特别危险,因为您不必像使用PBKDF2这样的基于密码的密钥派生函数那样使用盐或工作因子。基本上,仅当您知道密码包含足够的熵时才这样做

但是,对于同一密钥使用全零IV会更糟(如注释中已指出的)。它使攻击者可以找到重复的(纯文本输入)起始点。始终建议使用经过身份验证的加密(例如,使用HMAC-SHA-1),或多或少要求使用传输模式加密(与无法进行纯文本/填充oracle攻击的就地加密相反)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Dart中解密AES / CBC / PKCS5Padding加密

来自分类Dev

使用CryptoJS解密AES / CBC / PKCS5Padding

来自分类Dev

从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

来自分类Dev

在iOS中使用AES / CBC / PKCS7Padding 128位算法在Android中加密的解密字符串的问题

来自分类Dev

Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

来自分类Dev

AES / cbc / pkcs5padding加密IOS

来自分类Dev

PHP中的AES / CBC / PKCS#5加密算法

来自分类Dev

如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

使用 AES/CBC/PKCS7Padding 加密/解密

来自分类Dev

C#中的Java AES / CBC / PKCS5Padding

来自分类Dev

AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

来自分类Dev

用Java加密/解密“ AES / ECB / PKCS5Padding”

来自分类Dev

用Java加密/解密“ AES / ECB / PKCS5Padding”

来自分类Dev

从Java到PHP的带有SecretKey的AES CBC PKCS5Padding

来自分类Dev

为什么我收到javax.crypto.BadPaddingException(AES / CBC / PKCS5Padding)

来自分类Dev

AES 256 位 CBC PKCS#5 在 Python 中加密/解密

来自分类Dev

将文本加密为AES / CBC / PKCS7Padding

来自分类Dev

VBA AES CBC加密

来自分类Dev

如何在 Javascript 中使用 AES-128-CBC 算法加密字符串?

来自分类Dev

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

来自分类Dev

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

来自分类Dev

AES / CBC / NoPadding加密和解密

来自分类Dev

AES-128 CBC解密

来自分类Dev

使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

来自分类Dev

具有无效密钥的'aes-256-cbc'算法的Crypto.decipher.final失败,解密失败

来自分类Dev

Java使用aes256 / CBC / PKCS7Padding加密文件

来自分类Dev

使用OpenSSL进行AES_128_CBC加密/解密

Related 相关文章

  1. 1

    在Dart中解密AES / CBC / PKCS5Padding加密

  2. 2

    使用CryptoJS解密AES / CBC / PKCS5Padding

  3. 3

    从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

  4. 4

    在iOS中使用AES / CBC / PKCS7Padding 128位算法在Android中加密的解密字符串的问题

  5. 5

    Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

  6. 6

    AES / cbc / pkcs5padding加密IOS

  7. 7

    PHP中的AES / CBC / PKCS#5加密算法

  8. 8

    如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

  9. 9

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  10. 10

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  11. 11

    使用 AES/CBC/PKCS7Padding 加密/解密

  12. 12

    C#中的Java AES / CBC / PKCS5Padding

  13. 13

    AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

  14. 14

    用Java加密/解密“ AES / ECB / PKCS5Padding”

  15. 15

    用Java加密/解密“ AES / ECB / PKCS5Padding”

  16. 16

    从Java到PHP的带有SecretKey的AES CBC PKCS5Padding

  17. 17

    为什么我收到javax.crypto.BadPaddingException(AES / CBC / PKCS5Padding)

  18. 18

    AES 256 位 CBC PKCS#5 在 Python 中加密/解密

  19. 19

    将文本加密为AES / CBC / PKCS7Padding

  20. 20

    VBA AES CBC加密

  21. 21

    如何在 Javascript 中使用 AES-128-CBC 算法加密字符串?

  22. 22

    使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

  23. 23

    使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

  24. 24

    AES / CBC / NoPadding加密和解密

  25. 25

    AES-128 CBC解密

  26. 26

    使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

  27. 27

    具有无效密钥的'aes-256-cbc'算法的Crypto.decipher.final失败,解密失败

  28. 28

    Java使用aes256 / CBC / PKCS7Padding加密文件

  29. 29

    使用OpenSSL进行AES_128_CBC加密/解密

热门标签

归档