【问题标题】:How to create IV for fips 197 standard AES 128 bit encryption (Android)如何为 fips 197 标准 AES 128 位加密 (Android) 创建 IV
【发布时间】:2016-01-25 12:02:32
【问题描述】:

我从使用 AES 128 位标准:FIPS 179 加密的流中获取一些数据包。他们只给了我一个 16 字符的字符串作为密码。 在 Android 方法中有一个 IV 参数。我在SO thread 中使用了示例代码。但数据不会解密。

public class AESCrypt {

private final Cipher cipher;
private final SecretKeySpec key;
private AlgorithmParameterSpec spec;


public AESCrypt(String password) throws Exception
{
    // hash password with SHA-256 and crop the output to 128-bit for key
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.update(password.getBytes("UTF-8"));
    byte[] keyBytes = new byte[32];
    System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);

    cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    key = new SecretKeySpec(keyBytes, "AES");
    spec = getIV();
}       

public AlgorithmParameterSpec getIV()
{
    byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
    IvParameterSpec ivParameterSpec;
    ivParameterSpec = new IvParameterSpec(iv);

    return ivParameterSpec;
}

public String encrypt(String plainText) throws Exception
{
    cipher.init(Cipher.ENCRYPT_MODE, key, spec);
    byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
    String encryptedText = new String(Base64.encode(encrypted, Base64.DEFAULT), "UTF-8");

    return encryptedText;
}

public String decrypt(String cryptedText) throws Exception
{
    cipher.init(Cipher.DECRYPT_MODE, key, spec);
    byte[] bytes = Base64.decode(cryptedText, Base64.DEFAULT);
    byte[] decrypted = cipher.doFinal(bytes);
    String decryptedText = new String(decrypted, "UTF-8");

    return decryptedText;
}

}

【问题讨论】:

  • “但数据不解密。” 这是什么意思?你有例外吗?你得到一些输出吗?如果你这样做了,输出长度是你所期望的吗?你所期望的和你得到的有什么区别(例如,前 16 个字节是噪声,其余的都可以)?您是否尝试过不将这 16 个字符用作密码,而是直接用作密钥?
  • 我得到异常:javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
  • 请提供完整且可重复的示例,包括输入、输出和预期输出。

标签: android aes fips


【解决方案1】:

要解密数据,您需要使用与加密数据相同的初始化向量。如果(并且希望)IV 并不总是相同,那么它必须以某种方式从流中可用。如果它已修复,则需要在代码中放入相同的字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2019-08-17
    • 2020-04-15
    • 1970-01-01
    相关资源
    最近更新 更多