Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解AES加密代码的说明_Java_Encryption_Cryptography_Aes_Jce - Fatal编程技术网

Java 理解AES加密代码的说明

Java 理解AES加密代码的说明,java,encryption,cryptography,aes,jce,Java,Encryption,Cryptography,Aes,Jce,我正在创建一个项目来加密和解密文件。我有两种算法可以很好地工作: public static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE

我正在创建一个项目来加密和解密文件。我有两种算法可以很好地工作:

public static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {

    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
}

public static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {

    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decrypted = cipher.doFinal(encrypted);
    return decrypted;
}

public static byte[] getRaw(String password_) throws Exception {

    byte[] keyStart = password_.getBytes();
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
    sr.setSeed(keyStart);
    kgen.init(128, sr); 
    SecretKey skey = kgen.generateKey();
    byte[] key = skey.getEncoded();  

    return key;
}
现在我需要解释一下它是如何工作的。它使用私钥吗?钥匙存放在哪里?有人能帮我吗

注意:有关代码示例中缺陷的详细描述,请参见

您的
encrypt()
decrypt()
操作分别使用Java的。将选择一个JCE提供程序来执行实际的加密-选择的提供程序将是提供AES实现的系统中的第一个提供程序。您已将算法定义为仅“AES”,因此操作模式和填充将由提供程序选择。如果要控制此操作,请使用“AES/mode/padding”(有关有效选项,请参阅)

getRaw
方法从密码派生AES密钥。密码的原始字节用于随机数生成器。然后使用随机数生成器为128位AES密钥生成足够的密钥材料。不同的密码将产生不同的种子,这将产生不同的随机字节流,从而产生不同的密钥。我怀疑这种方法会因为大多数人的密码中缺少熵而削弱,从而导致攻击减少且更容易

示例代码中没有密钥存储。JCE密钥通常使用对象持久化,并且存储机制依赖于提供程序

注意:有关代码示例中缺陷的详细描述,请参见

您的
encrypt()
decrypt()
操作分别使用Java的。将选择一个JCE提供程序来执行实际的加密-选择的提供程序将是提供AES实现的系统中的第一个提供程序。您已将算法定义为仅“AES”,因此操作模式和填充将由提供程序选择。如果要控制此操作,请使用“AES/mode/padding”(有关有效选项,请参阅)

getRaw
方法从密码派生AES密钥。密码的原始字节用于随机数生成器。然后使用随机数生成器为128位AES密钥生成足够的密钥材料。不同的密码将产生不同的种子,这将产生不同的随机字节流,从而产生不同的密钥。我怀疑这种方法会因为大多数人的密码中缺少熵而削弱,从而导致攻击减少且更容易


示例代码中没有密钥存储。JCE密钥通常使用对象持久化,存储机制依赖于提供程序。

上面的代码是一堆废话。不幸的是,它经常被用作Android相关代码的代码片段(Android代码使用与Java相同的API,因此不需要特定于Android的示例,不幸的是,它在Android上特别失败)

我将解释这些问题:

  • 使用
    SecureRandom
    作为基于密码的密钥派生函数(PBKDF)是完全愚蠢的。SecureRandom实现的底层实现可能会更改。此外,
    SecureRandom
    没有指定调用
    setSeed()
    作为第一个方法将替换种子;它实际上可能会将种子添加到当前状态,而某些较新的android版本就是这样做的
  • Cipher.getInstance(“AES”)
    实际上使用提供程序默认值,而不是指定给定密码的操作模式和填充模式。默认情况下,Sun提供程序将使用ECB模式,该模式不适合加密大多数数据
  • String.getBytes()
    -用于密码-返回平台默认编码。不同的平台可能有不同的默认编码。这意味着不同的平台将生成不同的密钥
  • 上述代码未添加消息身份验证代码(MAC或HMAC)。这可能导致攻击者更改随机密文块,从而导致随机纯文本块。如果应用填充Oracle攻击,这也可能导致机密性丢失

  • 在我看来,你是密码学的初学者。请使用更高级别的标准,如,或使用标准,如。

    以上代码是一堆废话。不幸的是,它经常被用作Android相关代码的代码片段(Android代码使用与Java相同的API,因此不需要特定于Android的示例,不幸的是,它在Android上特别失败)

    我将解释这些问题:

  • 使用
    SecureRandom
    作为基于密码的密钥派生函数(PBKDF)是完全愚蠢的。SecureRandom实现的底层实现可能会更改。此外,
    SecureRandom
    没有指定调用
    setSeed()
    作为第一个方法将替换种子;它实际上可能会将种子添加到当前状态,而某些较新的android版本就是这样做的
  • Cipher.getInstance(“AES”)
    实际上使用提供程序默认值,而不是指定给定密码的操作模式和填充模式。默认情况下,Sun提供程序将使用ECB模式,该模式不适合加密大多数数据
  • String.getBytes()
    -用于密码-返回平台默认编码。不同的平台可能有不同的默认编码。这意味着不同的平台将生成不同的密钥
  • 上述代码未添加消息身份验证代码(MAC或HMAC)。这可能导致攻击者更改随机密文块,从而导致随机纯文本块。如果应用填充Oracle攻击,这也可能导致机密性丢失
  • 在我看来,你是个哭的初学者