已解决
密码学Python
使用Java RSA加密和使用BigInteger解密10
所以我试图找出如何在java中加密和解密RSA。 使用javas API进行加密,使用biginteger进行解密。 我完成了但是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;
}
}
这给出的输出是:input <> encrypted <> decrypted
1 <> 1 <> 1
3 <> 1088098617 <> 3
9 <> 1947497039 <> 9
27 <> -1665331145 <> 27
81 <> -1064046970 <> 81
243 <> -599005266 <> 243
729 <> -1534949160 <> 729
这是正确的,因为我试图加密和解密三个权力。 但有时它会给出错误的输出,例如:input <> encrypted <> decrypted
1 <> 1 <> 1
3 <> 1693488667 <> 3
9 <> -924345856 <> 9
27 <> 777525903 <> 144224668
81 <> -1602799071 <> 765474161
243 <> -227258229 <> 243
729 <> 1097077312 <> 296615835
这很奇怪? 知道我的代码有什么问题吗? 这是biginteger的问题还是我生成密钥的方式?
Rooney
2019.05.25
6408
收藏