Alors j'essaie de comprendre comment je peux crypter et décrypter RSA en Java. Le cryptage est effectué avec l'API javas et le décryptage avec biginteger. J'ai fini mais biginteger me donne parfois des résultats bizarres. Ceci est mon code:cryptage avec Java RSA et décryptage avec BigInteger
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class cryptoAndBigIntegerFIX {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException{
Security.addProvider(new BouncyCastleProvider());
System.out.println("input <> encrypted <> decrypted");
cryptoAndBigIntegerFIX.keygen();
BigInteger encryptbytes;
BigInteger decryptbytes;
//Multiple tests with powers of 3 for some reason :D
for(int i=1;i<1000;i*=3){
encryptbytes = cryptoAndBigIntegerFIX.encrypt(new BigInteger(""+i));
System.out.print(i + " <> " + encryptbytes.intValue() + " <> ");
decryptbytes = cryptoAndBigIntegerFIX.decrypt(encryptbytes);
System.out.println(decryptbytes.intValue());
}
}
public static RSAPrivateKey priv;
public static RSAPublicKey pub;
public static void keygen() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException{
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(512);
KeyPair keyPair = generator.generateKeyPair();
priv = (RSAPrivateKey) keyPair.getPrivate();
pub = (RSAPublicKey) keyPair.getPublic();
}
//Encrypt with javas API
public static BigInteger encrypt(BigInteger bg) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException{
byte[] encoded;
Cipher cipher=Cipher.getInstance("RSA/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, pub);
encoded=cipher.doFinal(bg.toByteArray());
return new BigInteger(encoded);
}
//Decrypt manually
public static BigInteger decrypt(BigInteger bg){
BigInteger decoded = bg.modPow(priv.getPrivateExponent(),priv.getModulus());
return decoded;
}
}
La sortie est ce qui donne:
input <> encrypted <> decrypted
1 <> 1 <> 1
3 <> 1088098617 <> 3
9 <> 1947497039 <> 9
27 <> -1665331145 <> 27
81 <> -1064046970 <> 81
243 <> -599005266 <> 243
729 <> -1534949160 <> 729
qui est correct que je suis en train de chiffrer et déchiffrer les pouvoirs de trois. Mais parfois, il donne une mauvaise sortie comme:
input <> encrypted <> decrypted
1 <> 1 <> 1
3 <> 1693488667 <> 3
9 <> -924345856 <> 9
27 <> 777525903 <> 144224668
81 <> -1602799071 <> 765474161
243 <> -227258229 <> 243
729 <> 1097077312 <> 296615835
qui est assez bizarre? Une idée de ce qui ne va pas avec mon code? Est-ce un problème avec biginteger ou avec la façon dont je génère des clés?
Pourquoi? 'Cipher' fournit un mode décryptage ainsi qu'un mode crypté. – EJP
C'était une "mission" donnée par mon professeur de prouver qu'ils sont une seule et même chose. Il me l'a renvoyé en disant que je devais faire un test JUNIT aussi. Il n'a rien dit à propos de ces erreurs que je montre ci-dessus alors peut-être qu'il ne les a pas remarqué parce que quand il a compilé il n'a pas eu de mauvaises réponses. La chose est, je ne peux même pas faire un test de JUNIT quand j'ai parfois une mauvaise réponse. – David