2016-12-15 38 views
-1

我有研究许多源代码,并发现如何指定在AES Java块大小的困难? Java支持到256位吗?我已经搜索出php源代码,它支持直到256位AES加密如何在java中使用AES 256位加密数据?

这是AES加密的示例源代码。感谢所有帮助我弄清楚。 http://aesencryption.net/

+0

看到我下面的评论。我发现你只需要用32字节的键值创建SecretKeySpec作为“AES”键。这使其处于AES256模式。 – slipperyseal

+1

有没有这样的东西,AES的块大小为256位。你的意思是钥匙大小? –

回答

1

PHP支持的Rijndael使用256块大小。 AES是Rijndael的一个子集,密钥大小为128,192和256位,的块大小为128位。所以说PHP支持256位块的AES是一个矛盾(即不正确)。

虽然您需要无限加密文件才能使用192位和256位加密,但由Oracle提供的Java SE(直至并包括Java 9)仅支持128位块大小和所有(3)AES密钥大小的AES。

要使用Rijndael的256位数据块的大小,你可以使用充气城堡轻量级API,块大小不同,没有加入到充气城堡供应商之一:

new RijndaelEngine(256) 

对于Android版可能要使用海绵改为城堡。

+0

并且不要相信带有花哨名称的clickbait网站。 –

-3

尝试:

public static void main(String[] args) { 
     String key = "1234567890ABCDEF"; 
     try { 
      byte[] encrypt = encrypt("hello word",key); 
      System.out.println(new String(encrypt)); 
      String decrypt = decrypt(encrypt, key); 
      System.out.println(decrypt); 
     } catch (Exception ex) { 

     } 

    } 

    public static byte[] encrypt(String message, String key1) throws Exception { 

     SecretKeySpec key = new SecretKeySpec(key1.getBytes(), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     return cipher.doFinal(message.getBytes()); 
    } 

    public static String decrypt(byte[] message, String key1) throws Exception { 

     Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE"); 
     SecretKeySpec key = new SecretKeySpec(key1.getBytes(), "AES"); 
     cipher.init(Cipher.DECRYPT_MODE, key); 
     byte[] decryptedByte = cipher.doFinal(message); 
     String decryptedText = new String(decryptedByte); 
     return decryptedText; 
    } 
+0

我发现你使用“AES”的SecretKeySpec并提供32个字节的密钥。它看起来像你使用的是一个16字节的密钥,其上面是AES128。如果你得到异常“InvalidKeyException:非法密钥大小异常”并不是因为你的代码错误,这是因为你没有设置强大的加密策略。至少这是我用Java发现的,不知道你是否会遇到这种情况与Android。 – slipperyseal

+1

给定代码的块大小和密钥大小都是128位,所以实际上并不能回答OP的问题,但很差。 –

+0

TRY IT对解决方案不是很好的描述。除此之外,你的代码有很多问题,例如使用ECB,忘记指定字符编码,明确指定SunJCE(@SlipperySeal,这意味着它甚至不会在Android上运行:P),使用文本字符串作为键,打印出不加密的密文,不好的异常处理...(然后你再次拼写正确的加密/解密,并且在解密之前将密文视为二进制字符串)。 –