Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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 安卓加密“;“垫块损坏”;例外_Java_Android_Exception_Encryption_Aes - Fatal编程技术网

Java 安卓加密“;“垫块损坏”;例外

Java 安卓加密“;“垫块损坏”;例外,java,android,exception,encryption,aes,Java,Android,Exception,Encryption,Aes,在此代码中,此行导致异常: clearText=c.doFinal(Base64.decode(encryptedText,Base64.DEFAULT)) javax.crypto.BadPaddingException:填充块损坏 我从以下渠道获得代码: 有什么想法吗 private String decrypt (String encryptedText) { byte[] clearText = null; try { S

在此代码中,此行导致异常:

clearText=c.doFinal(Base64.decode(encryptedText,Base64.DEFAULT))

javax.crypto.BadPaddingException:填充块损坏

我从以下渠道获得代码:

有什么想法吗

    private String decrypt (String encryptedText) {
        byte[] clearText = null;
        try {
            SecretKeySpec ks = new SecretKeySpec(getKey(), "AES");
            Cipher c = Cipher.getInstance("AES");
            c.init(Cipher.DECRYPT_MODE, ks);
            clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));
            return new String(clearText, "UTF-8");
        } catch (Exception e) {
            return null;
        }
    }

详细信息:我也在android上加密它

Java+android+Encryption+Exception通常只意味着一件事,有人再次使用
SecureRandom
类作为密钥派生函数。当
“SHA1PRNG”
SecureRandom
实现与Sun在Java SE中的实现不同时,此操作将失败。特别是如果将种子添加到随机数生成器的状态,而不是将种子用作PRNG的起点


基本上,只需使用
SecretKey aesKey=new SecretKeySpec(byte[]keyData,“AES”)
即可,或者-如果您以密码开始-尝试使用PBKDF2生成密钥。

Java+Android+加密+异常通常只意味着一件事,有人再次使用
SecureRandom
类作为密钥派生函数。当
“SHA1PRNG”
SecureRandom
实现与Sun在Java SE中的实现不同时,此操作将失败。特别是如果将种子添加到随机数生成器的状态,而不是将种子用作PRNG的起点


基本上,只需使用
SecretKey aesKey=new SecretKeySpec(byte[]keyData,“AES”)
即可,或者-如果您以密码开始-尝试使用PBKDF2生成密钥。

owlstead的建议很有帮助,但对于这种情况,在

安卓开发者注意:确保用户数据安全

我对代码做了一些修改,将来可能对其他人有所帮助。我完全删除了getkey方法

private static String seed;

/**
 * Encrypts the text. 
 * @param clearText The text you want to encrypt
 * @return Encrypted data if successful, or null if unsucessful
 */
protected String encrypt(String clearText) {
    byte[] encryptedText = null;
    try {
        byte[] keyData = seed.getBytes();
        SecretKey ks = new SecretKeySpec(keyData, "AES");
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.ENCRYPT_MODE, ks);
        encryptedText = c.doFinal(clearText.getBytes("UTF-8"));
        return Base64.encodeToString(encryptedText, Base64.DEFAULT);
    } catch (Exception e) {
        return null;
    }
}

/**
 * Decrypts the text
 * @param encryptedText The text you want to encrypt
 * @return Decrypted data if successful, or null if unsucessful
 */
protected String decrypt (String encryptedText) {
    byte[] clearText = null;
    try {
        byte[] keyData = seed.getBytes();
        SecretKey ks = new SecretKeySpec(keyData, "AES");
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.DECRYPT_MODE, ks);
        clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));
        return new String(clearText, "UTF-8");
    } catch (Exception e) {
        return null;
    }
}   

owlstead的建议很有帮助,但对于这种情况,在

安卓开发者注意:确保用户数据安全

我对代码做了一些修改,将来可能对其他人有所帮助。我完全删除了getkey方法

private static String seed;

/**
 * Encrypts the text. 
 * @param clearText The text you want to encrypt
 * @return Encrypted data if successful, or null if unsucessful
 */
protected String encrypt(String clearText) {
    byte[] encryptedText = null;
    try {
        byte[] keyData = seed.getBytes();
        SecretKey ks = new SecretKeySpec(keyData, "AES");
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.ENCRYPT_MODE, ks);
        encryptedText = c.doFinal(clearText.getBytes("UTF-8"));
        return Base64.encodeToString(encryptedText, Base64.DEFAULT);
    } catch (Exception e) {
        return null;
    }
}

/**
 * Decrypts the text
 * @param encryptedText The text you want to encrypt
 * @return Decrypted data if successful, or null if unsucessful
 */
protected String decrypt (String encryptedText) {
    byte[] clearText = null;
    try {
        byte[] keyData = seed.getBytes();
        SecretKey ks = new SecretKeySpec(keyData, "AES");
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.DECRYPT_MODE, ks);
        clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));
        return new String(clearText, "UTF-8");
    } catch (Exception e) {
        return null;
    }
}   
我从中了解到:

将“AES/ECB/PKCS7Padding”更改为“AES

我引用了以下内容:


将“AES/ECB/PKCS7Padding”更改为“AES

对我来说,问题在于
getKey()

确保两次调用
getKey()
返回相同的值


我使用
newsecurerandom(password.getBytes())
生成密钥。它在Windows上工作,但在Android上,它为不同的调用返回不同的值。

对我来说,问题在于
getKey()

确保两次调用
getKey()
返回相同的值


我使用
newsecurerandom(password.getBytes())
生成密钥。它在Windows上工作,但在Android上,它为不同的调用返回不同的值。

链接中所述的方式不是更安全吗?如果这个家伙花时间制作一个指南,它可能在他的机器上工作,但为什么我的机器不行呢;SecretKey ks=新的SecretKeySpec(keyData,“AES”);我试过这个,效果很好。Butt,因为现在它不会自动转换为128-192-256位,所以我必须手动输入,我想我需要添加一个自动转换的方法,有什么建议吗?@Esq没有标准化的方法通过添加零值来创建更小或更大的密钥,因为这显然会降低密钥提供的安全性。因此,要做到这一点,需要使用一个KDF,如果您现在拥有的关键数据中有足够的熵,那么它可能是一个KBKDF。如果数据少于16字节(对于AES-128),则应使用PBKDF加强密钥。PBKDF2方法已经由Java实现。KBKDF不存在,但它们相对容易从HMAC构建,例如,您可以使用HKDF。或者,您可以使用简单的KDF,如KDF1。基本上,您将一个设置为零的四个字节附加到密钥种子,然后将一个
OtherInfo
结构附加到该种子上(例如,
“ENC”
“MAC”
的ASCII表示)。最后,您可以使用任何加密安全散列(例如SHA-256)对其进行散列。然后使用最左边的字节作为KDF的输出。哦,我已经将缺少的KDF添加到Bouncy Castle。或者使用迭代计数为1的PBKDF2作为KBKDF。按照链接中所述的方式,它不是更安全吗?如果这个家伙花时间制作一个指南,它可能在他的机器上工作,但为什么我的机器不行呢;SecretKey ks=新的SecretKeySpec(keyData,“AES”);我试过这个,效果很好。Butt,因为现在它不会自动转换为128-192-256位,所以我必须手动输入,我想我需要添加一个自动转换的方法,有什么建议吗?@Esq没有标准化的方法通过添加零值来创建更小或更大的密钥,因为这显然会降低密钥提供的安全性。因此,要做到这一点,需要使用一个KDF,如果您现在拥有的关键数据中有足够的熵,那么它可能是一个KBKDF。如果数据少于16字节(对于AES-128),则应使用PBKDF加强密钥。PBKDF2方法已经由Java实现。KBKDF不存在,但它们相对容易从HMAC构建,例如,您可以使用HKDF。或者,您可以使用简单的KDF,如KDF1。基本上,您将一个设置为零的四个字节附加到密钥种子,然后将一个
OtherInfo
结构附加到该种子上(例如,
“ENC”
“MAC”
的ASCII表示)。最后,您可以使用任何加密安全散列(例如SHA-256)对其进行散列。然后使用最左边的字节作为KDF的输出。哦,我已经将缺少的KDF添加到Bouncy Castle。或者使用PBK