我使用下面的AES-128加密代码对一个16字节的块进行编码,但是编码值的长度给出了两个32字节的块。我是不是漏掉了什么?
plainEnc = AES.encrypt("thisisapassword!");
import java.security.*; import java.security.spec.InvalidKeySpecException; import javax.crypto.*; import sun.misc.*; public class AES { private static final String ALGO = "AES"; private static final byte[] keyValue = new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' }; public static String encrypt(String Data) throws Exception { System.out.println("string length: " + (Data.getBytes()).length); //length = 16 Key key = generateKey(); Cipher chiper = Cipher.getInstance(ALGO); chiper.init(Cipher.ENCRYPT_MODE, key); byte[] encVal = chiper.doFinal(Data.getBytes()); System.out.println("output length: " + encVal.length); //length = 32 String encryptedValue = new BASE64Encoder().encode(encVal); return encryptedValue; } public static String decrypt(String encryptedData) throws Exception { Key key = generateKey(); Cipher chiper = Cipher.getInstance(ALGO); chiper.init(Cipher.DECRYPT_MODE, key); byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); byte[] decValue = chiper.doFinal(decordedValue); String decryptedValue = new String(decValue); return decryptedValue; } private static Key generateKey() throws Exception { Key key = new SecretKeySpec(keyValue, ALGO); return key; } }
cipher.getInstance(“aes”)
返回使用PKCS#5填充的密码。这种填充在所有情况下都是添加的--当明文已经是块大小的倍数时,就会添加一整块填充。
在cipher.getInstance()
调用中显式指定您的意图,以避免依赖默认值,从而可能导致混淆:
Cipher.getInstance("AES/ECB/NoPadding");
你还会看到你使用的是ECB模式,这几乎在任何情况下都是一个糟糕的选择。
这应该是一个简单的问题,但我无法从openssl文档中找到任何示例或答案。 我想加密128位,应该适合一个加密块。 所以我调用,然后呢? 我是否调用(加密 128 位块)和(即使没有更多要加密的内容)? 还是只有?还是只有?
以下示例有什么问题? 问题是解密字符串的第一部分是无意义的。不过,其余的都很好,我明白了...
我在Java中使用AES加密/解密时遇到了一个非常奇怪的问题。如果我加密/解密的字符串小于16字节,则密码可以正常工作,但如果我向密码提供大于16字节的任何内容,则会出现错误“给定最终块未正确填充”。我构建了一些小代码作为示例: 当byte[]消息为“Hello”时,加密/解密工作正常,但当我将其更改为“hellomybabyhellomydright”时,它抛出异常。有人知道我做错了什么吗?
使用sizeof()打印变量的大小 为什么sizeof()返回int的大小,而不是短int,即2个字节?
问题内容: 如果我有一个字节变量: 为什么以下工作: …但这不是吗? 编译器第一理解为第二吗? [编辑] 我知道演员,但我想提请您注意 我认为它们是平等的,那么为什么编译器会有所不同呢?之间有什么区别 问题答案: 因为是的等效项,而的类型被提升为(JLS§5.6.2二进制数值提升),因此,如果不进行显式转换,则不能将其结果分配给它。 根据JLS,§15.26.2复合赋值运算符: 形式为E1 op