Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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_Encryption - Fatal编程技术网

Java 解密使用哈希密钥加密的消息

Java 解密使用哈希密钥加密的消息,java,encryption,Java,Encryption,我有一个问题,我需要解密使用AES=256加密的消息。我已经获得了一个密钥和向量。我必须使用SHA-256对提供的密钥进行散列,然后使用此散列对消息进行加密。解密代码运行正常,但结果不是原始字符串。 结果:m?>???????z?p???>?? byte[]original=cipher.dofinaleacryptoutils 我认为你应该使用decryptCipher而不是cipher你能把你的问题再读一遍并澄清一下吗?什么是有效的转换类型。真的很不好意思犯了这么愚蠢的错误,然后又发了帖子。

我有一个问题,我需要解密使用AES=256加密的消息。我已经获得了一个密钥和向量。我必须使用SHA-256对提供的密钥进行散列,然后使用此散列对消息进行加密。解密代码运行正常,但结果不是原始字符串。 结果:m?>???????z?p???>?? byte[]original=cipher.dofinaleacryptoutils


我认为你应该使用decryptCipher而不是cipher

你能把你的问题再读一遍并澄清一下吗?什么是有效的转换类型。真的很不好意思犯了这么愚蠢的错误,然后又发了帖子。谢谢你的时间!!!另一方面,你认为散列密钥然后加密是一个明智的主意吗?@AbhinashJha假设密码具有高熵、长且随机,这是可以的。如果输入的密码是humand,则可以使用PBKDF从密码生成密钥。对于CBC模式,IV应该是随机的谢谢@gusto2。我使用的是随机密码,不是人工输入的。我还有一个问题,请你回答。我正在JRE1.6中尝试上面的代码,它给出了非法的密钥大小。我做了一些研究,我想我们需要下载JCE jarslocal_policy.jar,US_export_policy.jar。但是有办法解决这个问题吗?@AbhinashJha For Java1.6您需要JCE出口政策。我相信OpenJDK 8可能已经允许无限制加密了,我可能错了。另一种选择是使用AES-128 128位密钥,它是安全的。根据我们的要求,我们需要使用AES-256。我从Java1.7中看到,上面的代码运行良好。但是,如果我替换下面的SecretKeySpec skeySpec=newsecretkeyspeckhashbytes,AES;使用SecretKeySpec skeySpec=new SecretKeySpecsomeKey.getBytesENCODING_UTF8,AES;其中someKey是提供的密钥。加密和解密在Java1.6中也可以正常工作。只有当我对提供的密钥进行散列,然后对该散列密钥进行加密时,它才会失败。所以,这让我很困惑。你对这个问题有什么看法吗?
try {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] hashBytes = digest.digest("someKey".getBytes(ENCODING_UTF8)); 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    IvParameterSpec iv = new IvParameterSpec("somevector".getBytes(ENCODING_UTF8));
    SecretKeySpec skeySpec = new SecretKeySpec(hashBytes, AES);
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
    byte[] cipherText = cipher.doFinal(plainText.getBytes(ENCODING_UTF8));          
    encrypted = EACECryptoUtils.base64Encode(cipherText);
    Cipher decryptCipher = Cipher.getInstance(TRANSFORMATION_TYPE);
    IvParameterSpec decryptIV = new IvParameterSpec("somevector".getBytes(ENCODING_UTF8));
    SecretKeySpec decryptSkeySpec = new SecretKeySpec(hashBytes, AES);
    decryptCipher.init(Cipher.DECRYPT_MODE, decryptSkeySpec, decryptIV);
    byte[] original = cipher.doFinal(EACECryptoUtils.base64Decode(encrypted));
    decrypted = new String(original);
    } catch (Exception e) {
            log.error(new LogRecord(FUNCTION_NAME + "Exception while encrypting the data", e));
            throw e;
        }
    }