Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Rijndael和256位的块大小进行加密或解密?_Java_Encryption_Cryptography_Aes_Rijndael - Fatal编程技术网

Java 如何使用Rijndael和256位的块大小进行加密或解密?

Java 如何使用Rijndael和256位的块大小进行加密或解密?,java,encryption,cryptography,aes,rijndael,Java,Encryption,Cryptography,Aes,Rijndael,出于某些原因,我需要使用256位的块大小来实现Rijndael de/compression,而不是使用128位块大小的AES(原因:数据在PHP中使用Rijndael进行加密…) 如何更改密码的块大小 如果我只是得到一个带有“RIJNDAEL/CFB/PKCS5Padding”的密码,并尝试用256位初始化一个IV,我会得到一个异常,因为块大小只有128位。任何Sun JCE提供程序都不支持除具有128位块大小的RIJNDAEL之外的任何东西:这是AES算法。要获得256位块大小的rijnda

出于某些原因,我需要使用256位的块大小来实现Rijndael de/compression,而不是使用128位块大小的AES(原因:数据在PHP中使用Rijndael进行加密…)

如何更改密码的块大小


如果我只是得到一个带有
“RIJNDAEL/CFB/PKCS5Padding”
的密码,并尝试用256位初始化一个IV,我会得到一个异常,因为块大小只有128位。

任何Sun JCE提供程序都不支持除具有128位块大小的RIJNDAEL之外的任何东西:这是AES算法。要获得256位块大小的rijndael,您必须去其他地方。我建议去图书馆。该类有一个接受以位为单位的块大小的构造函数。大多数人发现,如果使用合适的填充物,例如

PaddedBufferedBlockCipher c = new PaddedBufferedBlockCipher(new RijndaelEngine(256), new PKCS7Padding());

请注意,PHP mcrypt使用零字节填充,因此应使用
new ZeroBytePadding()
而不是
new PKCS7Padding()

下面是使用
CBC
RIJNDAEL 256
的完整实现

导入org.bounchycastle.crypto.CipherParameters;
导入org.bouncycastle.crypto.InvalidCipherTextException;
导入org.bouncycastle.crypto.engines.RijndaelEngine;
导入org.bouncycastle.crypto.modes.CBCBlockCipher;
导入org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
导入org.bouncycastle.crypto.paddings.ZeroBytePadding;
导入org.bouncycastle.crypto.params.KeyParameter;
导入org.bouncycastle.crypto.params.ParametersWithIV;
导入org.bouncycastle.util.encoders.Base64;
公共静态字符串encryptWithAesCBC(字符串明文、字符串密钥、字符串iv)
{
试一试{
PaddedBufferedBlockCipher cipher=新的PaddedBufferedBlockCipher(新的CBCBlockCipher(新的RijndaelEngine(256)),新的ZeroBytePadding());
CipherParameters ivAndKey=新参数swithiv(新的KeyParameter(key.getBytes()),iv.getBytes());
cipher.init(true,ivAndKey);
返回新字符串(Base64.encode(cipherData(cipher,plaintext.getBytes()));
}捕获(无效密文异常){
抛出新的运行时异常(e);
}
}
使用AESCBC进行公共静态字符串解密(字符串加密,字符串密钥,字符串iv)
{
试一试{
字节[]密文=Base64.解码(加密);
PaddedBufferedBlockCipher aes=新的PaddedBufferedBlockCipher(新的CBCBlockCipher(新的RijndaLengine(256)),新的ZeroBytepAdd());
CipherParameters ivAndKey=新参数swithiv(新的KeyParameter(key.getBytes()),iv.getBytes());
aes.init(假,ivAndKey);
返回新字符串(密文数据(aes,密文));
}捕获(无效密文异常){
抛出新的运行时异常(e);
}
}
私有静态字节[]密码数据(PaddedBufferedBlockCipher cipher,字节[]数据)引发InvalidCipherTextException
{
int minSize=cipher.getOutputSize(data.length);
byte[]f=新字节[minSize];
int length1=cipher.processBytes(数据,0,数据.length,exputf,0);
int length2=cipher.doFinal(extuf,length1);
int实际长度=长度1+长度2;
byte[]Cipherray=新字节[实际长度];
对于(int x=0;x
使用CFB时,
PaddedBufferedBlockCipher
应替换为以下内容:

PaddedBufferedBlockCipher aes=新的PaddedBufferedBlockCipher(新的CfBlockCipher(新的Rijndalengine(256),8),新的ZeroBytepAdd());
//PHP mcrypt对CFB使用8位的块大小
用法:

String salt=“fbhwei3497”;
字符串键=md5(salt);
管柱iv=md5(md5(盐));
字符串加密=encryptWithAesCBC(“文本到encript”,密钥,iv);
字符串解密=用AESCBC解密(加密,密钥,iv);

您可能必须确保安装了Java JCE unlimited encryption类。它们不是典型的标准Java发行版的一部分,因为它们在某些国家是非法的。仍然无法找到如何获取具有所需块大小的密码对象,因此我相信@GregS已经找到了答案。我相信Rijndael-256是JCE无限提供程序的一部分,但我习惯于使用我公司定制的Java,它有一个JCE提供程序,但它很可能是私有实现。你应该从标题中删除AES,AES只被标准化为128位块。具有256位块的Rijndael的安全性没有得到很好的研究,很可能比AES弱很多。无论出于什么原因,您必须使用256位块的Rijndael都不太可能。您能提供md5()吗?String md5(String input){String result=input;MessageDigest md;try{md=MessageDigest.getInstance(“md5”);md.update(input.getBytes());biginger hash=new biginger(1,md.digest());result=hash.toString(16);而(result.length()<32){//40 for SHA-1 result=“0”+result;}(NoSuchAlgorithmException e){e.printStackTrace();}返回结果;}上面的方法给出“java.lang.IllegalArgumentException:密钥长度不是128/160/192/224/256位”。@Krish我刚刚在答案中添加了md5实现。