我正在尝试对AndroidKeystore中的密钥执行RSA加密和解密。加密成功完成,但当我尝试解密时,它抛出一个InvalidKeyException:cipher.init()上的Keystore操作失败。
KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
AlgorithmParameterSpec spec = null;
spec = new KeyGenParameterSpec.Builder(mAlias,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build();
kpGenerator.initialize(spec);
KeyPair kp = kpGenerator.generateKeyPair();
这是我的加密代码:
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null);
Cipher cip = null;
RSAPublicKey pubKey = (RSAPublicKey) entry.getCertificate().getPublicKey();
cip = Cipher.getInstance("RSA/ECB/NoPadding");
cip.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] encryptBytes = cip.doFinal(challenge.getBytes());
String encryptedStr64 = Base64.encodeToString(encryptBytes, Base64.DEFAULT);
这是我的解密代码:
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null);
Cipher cip = null;
cip = Cipher.getInstance("RSA/ECB/NoPadding");
cip.init(Cipher.DECRYPT_MODE, entry.getPrivateKey());
byte[] decryptedBytes = cip.doFinal(Base64.decode(encrypted64, Base64.DEFAULT));
String plainText = new String(decryptedBytes);
我知道密钥生成代码中的填充与我的加密/解密代码不同。但是,当我将密钥生成代码的填充更改为KeyProperties.Encryption_Padding_None时,我得到的是KPGenerator.Initialize(spec)上的InvalidAlgorithmParameterException。在decrypt中使用“RSA/ECB/PKCS1Padding”,它起作用。不管加密中的填充,它总是起作用的。
03-06 09:10:32.710 5058 5058 W System.err: java.security.InvalidKeyException: Keystore operation failed
03-06 09:10:32.713 5058 5058 W System.err: at android.security.KeyStore.getInvalidKeyException(KeyStore.java:692)
03-06 09:10:32.713 5058 5058 W System.err: at android.security.KeyStore.getInvalidKeyException(KeyStore.java:712)
03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)
03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89)
03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:263)
03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:108)
03-06 09:10:32.713 5058 5058 W System.err: at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:612)
03-06 09:10:32.713 5058 5058 W System.err: at javax.crypto.Cipher.tryCombinations(Cipher.java:532)
03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.getSpi(Cipher.java:437)
03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.init(Cipher.java:815)
03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.init(Cipher.java:774)
03-06 09:10:32.714 5058 5058 W System.err: at dfpidentifiers.my.test.app.MainActivity.decrypt(MainActivity.java:950)
03-06 09:10:32.714 5058 5058 W System.err: at dfpidentifiers.my.test.app.MainActivity.onCreate(MainActivity.java:117)
03-06 09:10:32.714 5058 5058 W System.err: at android.app.Activity.performCreate(Activity.java:6251)
03-06 09:10:32.714 5058 5058 W System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.-wrap11(ActivityThread.java)
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
03-06 09:10:32.714 5058 5058 W System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
03-06 09:10:32.714 5058 5058 W System.err: at android.os.Looper.loop(Looper.java:148)
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
03-06 09:10:32.714 5058 5058 W System.err: at java.lang.reflect.Method.invoke(Native Method)
03-06 09:10:32.714 5058 5058 W System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
03-06 09:10:32.714 5058 5058 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-06 09:10:32.714 5058 5058 W System.err: Caused by: android.security.KeyStoreException: Incompatible padding mode
03-06 09:10:32.714 5058 5058 W System.err: at android.security.KeyStore.getKeyStoreException(KeyStore.java:632)
03-06 09:10:32.714 5058 5058 W System.err: ... 24 more
InvalidKeyException确实是由密钥生成和解密过程中的填充差异引起的。不知道为什么加密没有抛出相同的异常。
我最初也无法在密钥生成期间使用NoPadding,因为需要IND-CPA。我必须设置setRandomizedEncryptionRequired(true)来重写这个。
这是我的密码 抱歉,如果我的代码一团糟。
我在.NET Core2.0中创建了一个RSA加密/解密服务,目前我使用密钥库机密来保存RSA密钥。但据我所知,我可以用Key Vault密钥实现这一点,但目前还不能实现,因为KV Keys不支持2048长RSA密钥的加密/解密...这真让我摸不着头脑。 那么,我是否可以使用带有Azure Key Vault密钥的2048密钥来实现RSA加密/解密呢?
本文向大家介绍Python生成rsa密钥对操作示例,包括了Python生成rsa密钥对操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python生成rsa密钥对操作。分享给大家供大家参考,具体如下: 对文件进行RSA加密解密 PS:关于加密解密感兴趣的朋友还可以参考本站在线工具: 在线RSA加密/解密工具: http://tools.jb51.net/password/rsa_e
userData.json:
我们有一个签名服务,它接受sha256哈希作为输入,并使用pkcs11和C#中的bouncy Castle库对哈希进行签名,将签名摘要编码为Bae64并将其发送给请求者。因此,本质上我们正在生成哈希的哈希并对哈希进行签名。 为了验证这一点,另一端的请求者解码Base64接收到的摘要并验证它。我在PowerShell中使用了一个. NET库,并实现了一个验证过程。请参阅下面。 现在,为了避免散列,我