我在使用java AES/CBC/PKCS7Padding加密时遇到了问题。我已经在使用bouncycastle
提供程序之前进行搜索和跟踪。但我还是无法得到正确的加密
假设要求是:
加密类型:对称
算法:AES
块大小=128Bit(16字节)
密码模式:CBC
填充模式:PKCS7
加密密钥长度:256 Bit(32字节)
向量初始化长度(IV):128 Bit(16字节)
示例:
普通数据=ABC123
加密数据(base64编码)=CTGTW4HJFxxILSFNR1XMRG==
我的密码是...
public final class StringFunc {
final static String key = "jb2a19ou79rws6zknjlr803fvfgiyp1k";
final static String algorithm = "AES/CBC/PKCS7Padding";
final static String iv = "hod74ty97wr97g83";
private static Cipher cipher = null;
private static SecretKeySpec skeySpec = null;
private static IvParameterSpec ivSpec = null;
private static void setUp(){
try{
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
skeySpec = new SecretKeySpec(key.getBytes(), "AES");
ivSpec = new IvParameterSpec(iv.getBytes());
cipher = Cipher.getInstance(algorithm);
}catch(NoSuchAlgorithmException | NoSuchPaddingException ex){
}
}
public static String encrypt(String str){
try{
Integer strL = (int) Math.ceil(str.length() / 8.0);
Integer strB = strL*8;
str = padRight(str, '', strB);
setUp();
try {
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
} catch (InvalidAlgorithmParameterException ex) {
return "";
}
byte[] enc = cipher.doFinal(str.getBytes());
return new String(Base64.encodeBase64(enc));
}catch(InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex){
return "";
}
}
public static String padRight(String msg, char x, int l) {
String result = "";
if (!msg.isEmpty()) {
for (int i=0; i<(l-msg.length()); i++) {
result = result + x;
}
result = msg + result;
}
return result;
}
}
我还是无法得到正确的加密。任何人都可以提供帮助或建议?
根据给定的输入进行猜测,您应该遇到Javas对密钥长度的限制:由于美国不允许使用硬安全密钥,因此Java的密钥长度被限制为默认为128bit。
要启用keys>128bit,您必须使用官方的“无限”策略更改Java版本的策略(这里针对SE8)
用下载覆盖lib/security中的当前策略就足够了。
这几天我一直在纠结。我需要使用一个接受加密参数的API。API是用C#编写的。请求的加密如下: 算法:AES 密码模式:CBC 填充模式:PKCS7 块大小:128 密钥大小:256 加密字符串的表示形式:Base64 在搜索和尝试了网上建议的那么多东西之后,我仍然无法生成相同的加密值(特别是默认情况下不支持PKCS7,而PKCS5应该工作相同,但事实并非如此)。以下是我尝试过的一些方法: 1)使
我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB
问题内容: 我目前正在使用 256个字节的* 密钥大小来用Java加密文件,但是在搜索时我在stackexchange PKCS#5-PKCS#7填充上发现了它,并提到: * PKCS#5填充是8个字节块大小的PKCS#7填充的子集 所以我想知道 相对于上述配置,性能会更好吗? 正如我们所提到的,我们如何在Java中配置块大小 PKCS#7填充适用于从1到255字节的任何块大小。 我的示例代码是
我一直在搜索一个Java代码示例来执行以下操作,但没有成功。我正在为我的特殊情况寻找解决办法。 已使用“testtest”为密码生成密钥和IV: 我可以访问加密文件,盐,钥匙和IV。我不相信我会收到密码。此外,我还安装了无限强度JCE策略。到目前为止,我只找到了另一个java程序进行加密并生成这些参数的示例。对于我的情况,我必须使用salt、key和iv值来解密一个文件。这在Java中是可能的吗?
我使用java中的模式“AES/CBC/PKCS7PADDING”在2个设备之间进行通信。 注意:这里我只放了加密代码,但我们有类似的解密代码。 在通信开始时已经发送了IV矢量。然后,我们希望这两个设备交换加密的消息,而不再发送IV。如果我们的理解是正确的,只要没有消息丢失,两个设备都应该知道在异或中使用的当前“向量”是什么。 然而,Java代码并不像我们期望的那样工作:如果我连续调用encryp
我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/