- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用此代码创建 AES key
public static SecretKey generateSecretKey() {
KeyGenerator generator;
try {
generator = KeyGenerator.getInstance(StaticHandler.AES_KEY_MODE); // Is "AES"
generator.init(StaticHandler.AES_KEY_SIZE); // The AES key size in number of bits // Is "128"
return generator.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
但是使用此代码进行加密/解密
public static String encrypt(String data, SecretKey secret, Charset charset) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
return new String(cipher.doFinal(data.getBytes()), charset);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String decrypt(String data, @NonNull SecretKey secret, Charset charset) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret);
return new String(cipher.doFinal(data.getBytes()), charset);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
收到错误java.security.InvalidKeyException:参数丢失
我猜我需要添加一些盐,尽管我不知道如何使用生成的 key 来做到这一点。我想避免生成密码,但如果它是安全生成的密码,我不会介意。
编辑:事后想一想,如果我通过网络发送数据包,我应该使用 GCM 还是 CBC 加密?请记住,我使用的是随机生成的 key ,并且不会为每个客户端和服务器 session 随机生成的 session 保留它们。
最佳答案
不,你不需要盐,而且你的 key 实际上没问题。 CBC 模式需要 IV(初始化 vector ),see wikipedia 、IV 对于每条加密数据应该不同,但每次解密必须使用与相应加密相同的值。 (补充)对于 CBC 来说,虽然不是其他一些模式,但 IV 不能被对手预测对于安全来说也至关重要;实现唯一性和不可预测性的最简单和最常见的方法是使用安全随机数(又名位)生成器,例如 Java 的 SecureRandom
。如果您想了解其他方法,这实际上并不是一个编程问题,并且更适合 crypto.SX 或 security.SX,其中已经有几个 Q。
您可以显式生成 IV 并将其指定为加密和解密,或者允许加密操作本身生成 IV,从加密密码中获取它,并将其指定为解密密码。无论哪种情况,加密者都必须提供解密者将使用的值;一种常见的方法是简单地将 IV 与密文连接起来(使得它们很容易保持正确匹配),但同样还有关于加密和安全性的其他方法讨论。请参阅https://docs.oracle.com/en/java/javase/11/security/java-cryptography-architecture-jca-reference-guide.html在名为“初始化密码对象”(方法声明的盒装 block 之后的两段)和“管理算法参数”的部分中。
<小时/>另外不要将密文存储在字符串
中。 Java String
旨在处理有效字符而不是任意字节。将密文“解码”为字符串并将其“编码”回二进制几乎总是会丢失或更改一些数据,特别是如果您允许两端的字符集不同,并且使用现代密码学对密文进行任何更改将破坏您的全部或大部分数据。由于密文是字节,因此最好将其处理为byte[]
;如果这是不可能的,因为您想将其放入 URL 等 is 字符中,请使用旨在将任意字节编码为文本的多种方案之一,以便可以正确恢复它们:base64 ( 3 或 4 个主要变体,加上许多次要变体)、base32、十六进制/base16、URL“百分比”编码、MIME 引用打印、yencode、Kermit、PPP 等。 j8+ java.util.Base64
提供较新的 base64 变体(即不是 uuencode)。
相反,虽然现代加密中的“明文”实际上可以是任何形式的数据,但如果您的数据确实是文本并且属于字符串
,那么您应该使用加密前使用合适的字符集,解密后使用相同字符集进行解码,即
byte[] ctext = encCipher.doFinal (input.getBytes(charset));
...
String output = new String (decCipher.doFinal (ctext), charset);
虽然“最佳”字符集可能会根据您的数据而有所不同,但如果您不知道数据是什么或不想费心分析它,UTF-8
相当不错对于大多数文本数据来说非常流行和标准。
关于java - 如何使用 AES/CBC/PKCS5Padding 生成 AES key 进行加密和解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58599423/
常用的 PKCS 标准有什么用:PKCS#7、PKCS#10 和 PKCS#12? 最佳答案 PKCS#7 允许您使用 X.509 证书对通用数据进行签名和加密。 PKCS#7 格式也可用于存储一个或
我想知道当使用 AES-128-CBC 时,openssl 如何处理可被 8 个字节整除的消息。 openssl 如何检测到没有要删除的填充(PKCS#5/PKCS#7)?特别是当消息以 ASCII
我正在阅读 PKCS 11 文档,但我无法清楚地理解 key 的 CKA_SENSITIVE 属性是什么意思。 更常见的是:我在哪里可以阅读属性描述? 最佳答案 引自 PKCS#11 spec v2.
我想寻求有关使用 cryptography.hazmat.primitives.padding.PKCS7 的帮助Python 类。 解密后,我得到字符串45394700000019770808080
我知道 PKCS#7 = 证书 + 可选原始数据 + PKCS#1 格式的签名 我需要从 PKCS#7 签名中提取 PKCS#1 如何在 C# 中执行此操作。我可以用充气城堡来做这个吗,这是我的实现I
我希望能够使用带有 aws golang SDK 的 AWS SNS 发送 iOS APNS 推送通知。我按照以下说明创建了一个 p12 文件:https://support-aws.s3.amazo
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我正在开发一个移动应用程序,它必须验证它收到的一些签名。我拥有我需要的一切——输入数据、公钥和签名。但有一个问题。我使用方法 SHA256withRSA 进行签名验证,其中包含以下几行代码来验证签名:
我有一个 PKCS#5 加密的 PKCS#8 RSA 私钥存储在一个磁盘文件中(最初由 SSLPlus 生成,大约在 1997 年),例如: -----BEGIN ENCRYPTED PRIVATE
是否可以将 PKCS#8 编码的 RSA 私钥转换为 PKCS#1?我知道这可以通过 openssl 轻松完成,但是可以用 Java 完成吗? 最佳答案 使用 BouncyCaSTLe 1.50 Pr
我正在为 Android 实现 Jscep。最初,我尝试了 Jscep for java,效果很好。现在在 Android 中,我使用 SpongyCaSTLe 而不是 BouncyCaSTLe。现在
我正在尝试在 SafeNet HSM 中生成一个 RSA key 对。我为私钥和公钥复制了 PKCS11 中指定的示例模板。当我生成 key 对时,一切正常。但是,当我为私钥指定以下属性值时,C_Ge
密码学在信息安全中扮演着至关重要的角色。为了保护敏感信息、数字身份和网络通信的安全性,密码设备(如硬件安全模块HSM)与应用程序之间的安全通信和互操作性变得至关重要。PKCS#11(Public-K
这玩意折腾了一天,有个老外的代码,公钥用了PKCS#1,私钥用了PKCS#8。调用了不同的API,而我的全是生成的PKCS#8,后面查阅了大量资料和长时间调试程序,才发现了问题,在此记录下。 用Ope
PKCS#12是一种将私钥与其对应的 X.509 证书合并为标准化的单一文件格式的便捷方式。然而,该规范于 1999 年由 RSALabs 发布,并且仅使用 RC4、RC2 和 TripleDES 进
我正在尝试使用 PKCS#7 进行签名和验证签名。我正在阅读《beginning cryptography with java》这本书。我已经编写了示例代码来签名和验证。当我尝试附加签名并将其写入文件
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 4年前关闭。 Improve this qu
使用java加密、签名、解密、验证签名需要遵循哪些步骤? 使用 PKCS#7 算法, java keystore 有什么用?关于 PKCS#7。 最佳答案 第 1 步 使用 keytool 实用程序生
我在 iPhone 上使用这个 OpenSSL 代码生成一个 PKCS#12 文件,给定证书/私钥的一些数据。我能够验证此 PKCS#12 在 OpenSSL 上是否可解析,因为当我在代码中检查它时它
我实际上正在研究一个应该从 PKCS7 mime 加密消息中提取 RecipientInfo 的函数。我想这样做的原因是,我想获取邮件加密的所有邮件地址(或至少是 keyids/指纹)。 嗯 - 我尝
我是一名优秀的程序员,十分优秀!