gpt4 book ai didi

java - org.bouncycaSTLe.crypto.InvalidCipherTextException : block incorrect

转载 作者:太空宇宙 更新时间:2023-11-04 11:43:14 31 4
gpt4 key购买 nike

我必须使用 bouncycaSTLe api 对文件进行编码,加密效果很好,但在第一次迭代中解密时出现错误org.bouncycaSTLe.crypto.InvalidCipherTextException:出现 block 不正确

这是为了加密及其工作

public void cifrado() throws IOException, InvalidCipherTextException{
RSAEngine motor = new RSAEngine();
PKCS1Encoding padding = new PKCS1Encoding(motor);

BufferedReader fClave = new BufferedReader(new FileReader(clave));

File Entrada = new File(ficheroEntrada);
BufferedInputStream bInEntrada = new BufferedInputStream(new FileInputStream(Entrada));

File Destino = new File(ficheroSalida);
BufferedOutputStream bOutDestino = new BufferedOutputStream(new FileOutputStream(Destino));

//Metemos en un String la clave leida del fichero con readline en la que tendremos modulo, caracter CRLF y exponente
String modulo = fClave.readLine();
String exponente = fClave.readLine();
//Decodificamos el Hexadecimal leido
byte[] bModulo = Hex.decode(modulo);
byte[] bExponente = Hex.decode(exponente);

//Ahora con el modulo y exponente ya podemos utilizar el RSAKeyParameter e inicializar el motor de padding en modo cifrado
padding.init(true, new RSAKeyParameters(false,new BigInteger(bModulo),new BigInteger(bExponente)));
System.out.println(padding.getInputBlockSize() + " " + padding.getOutputBlockSize());

//Leemos de 117 bytes en 117 bytes que es lo maximo que admite los bloques de entrada
byte[] array117 = new byte[117];
byte[] salida;
long longitudFichero = Entrada.length();
System.out.println(longitudFichero);
long contador = longitudFichero;
while(contador>0){
bInEntrada.read(array117, 0, array117.length);
salida= padding.processBlock(array117, 0, array117.length);
System.out.println(salida.length);
bOutDestino.write(salida, 0, salida.length);
contador = ((contador>0)?contador-=117:contador);
}
bInEntrada.close();
bOutDestino.close();
fClave.close();
}

这是为了解密

public void descifrado() throws IOException, InvalidCipherTextException{
RSAEngine motor = new RSAEngine();
PKCS1Encoding padding = new PKCS1Encoding(motor);

BufferedReader fClave = new BufferedReader(new FileReader(clave));

File Entrada = new File(ficheroEntrada);
BufferedInputStream bInCifrado = new BufferedInputStream(new FileInputStream(Entrada));

File Destino = new File(ficheroSalida);
BufferedOutputStream bOutDescifrado = new BufferedOutputStream(new FileOutputStream(Destino));

//Metemos en un String la clave leida del fichero con readline en la que tendremos modulo, caracter CRLF y exponente
String modulo = fClave.readLine();
String exponente = fClave.readLine();
//Decodificamos el Hexadecimal leido
byte[] bModulo = Hex.decode(modulo);
byte[] bExponente = Hex.decode(exponente);
System.out.println(bModulo.length + " " + bExponente.length);
//Ahora con el modulo y exponente ya podemos utilizar el RSAKeyParameter e inicializar el motor de padding en modo descifrado
padding.init(false, new RSAKeyParameters(false,new BigInteger(bModulo),new BigInteger(bExponente)));
System.out.println(padding.getInputBlockSize() + " " + padding.getOutputBlockSize());

//Leemos de 128 bytes en 128 bytes que es lo maximo que admite los bloques de entrada cuando decodificamos
byte[] array128 = new byte[128];

long longitudFichero = Entrada.length();
long contador = longitudFichero;
System.out.println(longitudFichero);
while(contador!=0){
bInCifrado.read(array128, 0, array128.length);
byte[] salida= padding.processBlock(array128, 0, array128.length);
System.out.println(salida.length);
/*for(byte i: salida){
System.out.println(i);
}*/
bOutDescifrado.write(salida, 0, salida.length);
contador -=128;
}
bInCifrado.close();
bOutDescifrado.close();
fClave.close();
}

最佳答案

我只是修复了重复的最后一个 block ,解决方案是在cifrado方法中,我必须检查最后一个 block 的输入大小是否正确

while(contador>0){
if(contador>0 && contador<117){
byte[] ultimo = new byte[(int) contador];
bInEntrada.read(ultimo, 0, ultimo.length);
salida= padding.processBlock(ultimo, 0, ultimo.length);
System.out.println(salida.length);
bOutDestino.write(salida, 0, salida.length);
contador=0;

}else{
bInEntrada.read(array117, 0, array117.length);
salida= padding.processBlock(array117, 0, array117.length);
System.out.println(salida.length);
bOutDestino.write(salida, 0, salida.length);
contador = ((contador>0)?contador-=117:contador);
}
}

关于java - org.bouncycaSTLe.crypto.InvalidCipherTextException : block incorrect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42597469/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com