在首次尝试实现AES-GCM的过程中,面临着身份验证标记生成、加密密码生成和GCM mac校验失败的问题。对于当前实现,标记[]
正在填充,但字节[]encrypted
仍然为空。因此,Cipher.doFinal(data1,offset)
给出了“GCM中的MAC检查失败
”。这似乎是围绕字节数组大小的一些问题,能否有人分享一下,应该在什么基础上确定输出缓冲区大小?这是不是应该分块进行?
任何指向AES-GCM实施的指针/链接都将受到高度赞赏。
以下是我们的实施情况:
public class GCMTest {
public static void main(String[] args) throws Exception {
//***********************************************************
//Key
byte[] key = MessageDigest.getInstance("MD5").digest("1234567890123456".getBytes("UTF-8"));//this is the random key
//Iv
SecureRandom srand = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[256];
srand.nextBytes(iv);
//Input
byte[] data="inputPlainText".getBytes();
final GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(16 * Byte.SIZE, iv);
//***********************************************************
//Encryption
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", new BouncyCastleProvider());
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), gcmParameterSpec);
cipher.updateAAD("MyAAD".getBytes("UTF-8"));
//Encrypted output
final byte[] encrypted = new byte[cipher.getOutputSize(data.length)];
cipher.update(data, 0, data.length, encrypted, 0); //Not being updated for current data.
//Tag output
byte[] tag = new byte[cipher.getOutputSize(data.length)];
cipher.doFinal(tag, 0);
//***********************************************************
//Decryption
final SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);
cipher.updateAAD("MyAAD".getBytes("UTF-8"));
//What size should be assigned to outputBuffer?
final byte[] data1 = new byte[256];
int offset = cipher.update(encrypted, 0, encrypted.length, data1, 0);
cipher.update(tag, 0, tag.length, data1, offset);
cipher.doFinal(data1, offset);
boolean isValid = checkEquals(data, data1);
System.out.println("isValid :"+isValid);
}
private static boolean checkEquals(byte[] a, byte[] b)
{
int diff = a.length ^ b.length;
for(int i = 0; i < a.length && i < b.length; i++)
diff |= a[i] ^ b[i];
return diff == 0;
}
}
它给出以下例外情况:
Exception in thread "main" javax.crypto.AEADBadTagException: mac check in GCM failed
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(Cipher.java:2068)
at GCMTest.main(GCMTest.java:56)
提前谢谢!!
我也有同样的问题。对我来说,这与字符串的编码有关。我最后做了:
然后解密字符串:
代码如下:
private String encrypt(String src) {
byte[] srcBytes = src.getBytes(StandardCharsets.US_ASCII);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, secureRandom);
byte[] cipherText = cipher.doFinal(srcBytes);
byte[] encryptedBytes = new byte[12 + cipherText.length];
System.arraycopy(ivBytes, 0, encryptedBytes, 0, 12);
System.arraycopy(cipherText, 0, encryptedBytes, 12, cipherText.length);
return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);
}
private String decrypt(String encryptedString) {
byte[] encryptedBytes = Base64.decode(encryptedString, Base64.DEFAULT);
cipher.init(Cipher.DECRYPT_MODE, secretKey, new GCMParameterSpec(128, encryptedBytes, 0, 12));
byte[] decryptedBytes = cipher.doFinal(encryptedBytes, 12, encryptedBytes.length-12);
return Base64.encodeToString(decryptedBytes, Base64.DEFAULT);
}
我没有包括如何初始化它们的任何变量都可以从java文档中推断出来。我试图在Android系统中实现这一点,所以我不确定它有多大不同。我发现这篇文章非常有帮助:Java aes/gcm/nopadding-cipher.getiv()给了我什么?
我正在尝试使用AES/EAX/Nopadding执行加密/解密。由于EAX似乎没有BouncyCastle可用,所以BC被添加为提供程序。 null 我有一个AES/GCM/nopadding的实现,它使用了同样的代码,工作得很好。 我做错了什么?
我对用加密技术开发东西比较陌生。现在,我正在尝试编写一个类,它使用带有AES-GCM的BouncyCastle加密和解密字符串。我读过关于实现加密时必须考虑的事情。其中之一是你应该经常使用随机静脉注射。问题是,每次我尝试用IV初始化密码时,它不会正确解密我的文本。 它只是抛出以下异常: 我正在使用以下方法加密和解密我的数据。 如果我从cipher.init(...)中删除“generateiv(c
我有一个Kubernetes集群,其中不同的pod在不同的名称空间中运行。我如何知道是否有pod出现故障? 是否有任何单个命令来检查失败的pod列表或重述的pod列表? 重新启动的原因(日志)?
我看到了“krbeexception:Checksum failed”异常。看起来像是kerberos问题,但我无法解决。 任何关于如何解决问题的建议都会很好!提前谢谢。 机器细节: 没有可用的LSB模块。发行商ID:Ubuntu说明:Ubuntu 12.04.4 LTS发行版:12.04 java版本“1.7.0_55”OpenJDK运行时环境(IcedTea 2.4.7)(7u55-2.4.7
加密有三个阶段: 生成16字节随机数据作为CBC模式所需的初始向量(IV) 应用AES密码,使用PKCS5填充方案在CBC模式下加密文件内容。 应用MAC密码(例如“HMACSHA1”)来计算封装IV和密文的MAC 加密文件将是以下数据的级联:16字节IV密文20字节HMAC 我写的代码是这样的,它成功地加密了一个文本文件。这是我的应用程序的全部代码。
问题内容: 我正在尝试使用Flink 5.x Elasticsearch接收器连接器将数据插入到微型VM上托管的ES 5.2.1实例。 由于这是处于开发模式的微型VM,因此我无法使其启动以接受9300上的TransportClient远程客户端连接,而不会失败引导检查。 我已经尝试了以下设置,但无法启动(9200上的http客户端工作正常) 请注意,ES仅出于开发目的而在小型VM上运行,而我无权进