그래서 자바에서 RSA를 암호화하고 해독 할 수있는 방법을 찾으려고합니다. 암호화는 javas API로하고 biginteger로 해독합니다. 나는 끝났다. 그러나 biginteger는 나에게 이상한 결과를 때때로 준다. 이 제공Java RSA로 암호화 및 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 또는 열쇠를 생성하는 방식으로 문제가 무엇입니까?
왜? 'Cipher'는 암호 해독 모드와 암호화 모드를 제공합니다. – EJP
그것은 강사가 하나의 똑같은 역할을한다는 것을 증명하는 "과제"였습니다. 그는 나에게 JUNIT 테스트도해야한다고 말했습니다. 그는 위의 오류에 대해 아무 말도하지 않았으므로 컴파일 할 때 잘못된 대답이 없기 때문에 아무 것도 알지 못했을 것입니다. 문제는, 가끔 잘못된 대답을 얻을 때 JUNIT 테스트 케이스를 만들지도 않는다는 것입니다. – David