Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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
如何修复javax.crypto.IllegalBlockSizeException?_Java_Android_Encryption_Cryptography_Rsa - Fatal编程技术网

如何修复javax.crypto.IllegalBlockSizeException?

如何修复javax.crypto.IllegalBlockSizeException?,java,android,encryption,cryptography,rsa,Java,Android,Encryption,Cryptography,Rsa,我已经使用RSA的公钥加密成功地加密了我的AES密钥。使用RSA的私钥解密时,我得到: javax.crypto.IllegalBlockSizeException 适用于我的加密逻辑是: KeyGenerator keygen = KeyGenerator.getInstance("AES"); keygen.init(128); SecretKey key = keygen.generateKey(); Log.d("keyS", encodeToString(key.getEncoded(

我已经使用RSA的公钥加密成功地加密了我的AES密钥。使用RSA的私钥解密时,我得到:

javax.crypto.IllegalBlockSizeException

适用于我的加密逻辑是:

KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128);
SecretKey key = keygen.generateKey();
Log.d("keyS", encodeToString(key.getEncoded(), Base64.DEFAULT));
Calendar start = new GregorianCalendar();
Calendar stop = new GregorianCalendar();
stop.add(Calendar.YEAR,25);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(Objects.requireNonNull(getContext()))
        .setKeySize(2048)
        .setAlias(KEYSTORE_PROVIDER_ANDROID_KEYSTORE)
        .setSubject(new X500Principal("CN="+KEYSTORE_PROVIDER_ANDROID_KEYSTORE))
        .setSerialNumber(BigInteger.ZERO)
        .setStartDate(start.getTime()).setEndDate(stop.getTime()).build();
KeyPairGenerator keyPairGenerator;
KeyPair kp;
keyPairGenerator = KeyPairGenerator.getInstance("RSA", KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
keyPairGenerator.initialize(spec);
kp = keyPairGenerator.generateKeyPair();
Cipher cipher = Cipher.getInstance("RSA/None/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
String key64 = encodeToString(key.getEncoded(), Base64.DEFAULT);
editor.putString(SECRET,new String(cipher.doFinal(key64.getBytes()), StandardCharsets.UTF_8)).apply();
Log.d("key2",new String(cipher.doFinal(key64.getBytes()), StandardCharsets.UTF_8));
我目前使用的解密逻辑是:

final SharedPreferences settings = getSharedPreferences(SettingsActivity.PREF_SETTINGS, MODE_PRIVATE);
KeyStore keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
keyStore.load(null);
KeyStore.Entry entry = keyStore.getEntry(KEYSTORE_PROVIDER_ANDROID_KEYSTORE,null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
Cipher cipher = Cipher.getInstance("RSA/None/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] tmp = Objects.requireNonNull(settings.getString(SECRET, null)).getBytes(StandardCharsets.UTF_8);
Log.d("key3",new String(tmp));
Log.d("key4", encodeToString(cipher.doFinal(tmp), Base64.DEFAULT) );

如何修复cipher.doFinal()引发的此错误?

找到了解决方案。这是解决办法。感谢那些帮助我重新思考解决方案的人。 加密码:

KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128);
SecretKey key = keygen.generateKey();
Log.d("keyS", encodeToString(key.getEncoded(), Base64.DEFAULT));
Calendar start = new GregorianCalendar();
Calendar stop = new GregorianCalendar();
stop.add(Calendar.YEAR,25);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(Objects.requireNonNull(getContext()))
                            .setKeySize(2048)
                            .setAlias(KEYSTORE_PROVIDER_ANDROID_KEYSTORE)
                            .setSubject(new X500Principal("CN="+KEYSTORE_PROVIDER_ANDROID_KEYSTORE))
                            .setSerialNumber(BigInteger.ZERO)
                            .setStartDate(start.getTime()).setEndDate(stop.getTime()).build();
KeyPairGenerator keyPairGenerator;
KeyPair kp;
keyPairGenerator = KeyPairGenerator.getInstance("RSA", KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
keyPairGenerator.initialize(spec);
kp = keyPairGenerator.generateKeyPair();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
               editor.putString(SECRET,encodeToString(cipher.doFinal(key.getEncoded()), Base64.DEFAULT)).apply();
Log.d("key2",encodeToString(cipher.doFinal(key.getEncoded()), Base64.DEFAULT));
final SharedPreferences settings = getSharedPreferences(SettingsActivity.PREF_SETTINGS, MODE_PRIVATE);
KeyStore keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
keyStore.load(null);
KeyStore.Entry entry = keyStore.getEntry(KEYSTORE_PROVIDER_ANDROID_KEYSTORE,null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
String k64 = Objects.requireNonNull(settings.getString(SECRET, null));
byte[] tmp = decode(k64, Base64.DEFAULT);
Log.d("key3",k64);
MainActivity.key = new SecretKeySpec(cipher.doFinal(tmp),"AES");
Log.d("key4", encodeToString(MainActivity.key.getEncoded(),Base64.DEFAULT));
解密码:

KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128);
SecretKey key = keygen.generateKey();
Log.d("keyS", encodeToString(key.getEncoded(), Base64.DEFAULT));
Calendar start = new GregorianCalendar();
Calendar stop = new GregorianCalendar();
stop.add(Calendar.YEAR,25);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(Objects.requireNonNull(getContext()))
                            .setKeySize(2048)
                            .setAlias(KEYSTORE_PROVIDER_ANDROID_KEYSTORE)
                            .setSubject(new X500Principal("CN="+KEYSTORE_PROVIDER_ANDROID_KEYSTORE))
                            .setSerialNumber(BigInteger.ZERO)
                            .setStartDate(start.getTime()).setEndDate(stop.getTime()).build();
KeyPairGenerator keyPairGenerator;
KeyPair kp;
keyPairGenerator = KeyPairGenerator.getInstance("RSA", KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
keyPairGenerator.initialize(spec);
kp = keyPairGenerator.generateKeyPair();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
               editor.putString(SECRET,encodeToString(cipher.doFinal(key.getEncoded()), Base64.DEFAULT)).apply();
Log.d("key2",encodeToString(cipher.doFinal(key.getEncoded()), Base64.DEFAULT));
final SharedPreferences settings = getSharedPreferences(SettingsActivity.PREF_SETTINGS, MODE_PRIVATE);
KeyStore keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
keyStore.load(null);
KeyStore.Entry entry = keyStore.getEntry(KEYSTORE_PROVIDER_ANDROID_KEYSTORE,null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
String k64 = Objects.requireNonNull(settings.getString(SECRET, null));
byte[] tmp = decode(k64, Base64.DEFAULT);
Log.d("key3",k64);
MainActivity.key = new SecretKeySpec(cipher.doFinal(tmp),"AES");
Log.d("key4", encodeToString(MainActivity.key.getEncoded(),Base64.DEFAULT));

如果使用
RSA/None/NoPadding
,这意味着您正在进行填充。将其更改为
Cipher.getInstance(“RSA/ECB/OAEPWithSHA-256和mgf1padding”)
新字符串(cipher.doFinal(..
您正在使用不可打印的字符创建字符串。您应该在使用加密结果而不是密钥生成字符串之前对其进行b64编码。实际上,请使用适当的填充(RSA/ECB/OAEPWITHHA-256和MGF1填充或RSA/ECB/PKCS1,如果第一个不可用)RSA/ECB/OAEPWITHHA-256和MGF1填充显示javax.crypto.IllegalBlockSizeException