在我的应用程序中,当用户在最初的设置(指纹注册)中扫描手指时,我保存了用户访问代码的加密版本。当用户稍后试图解锁应用程序时,我将尝试使用指纹API[指纹验证]解密此访问代码。
但是,cipher.doFinaly
在解密时引发以下异常:
javax.crypto.BadPaddingException
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:482)
at javax.crypto.Cipher.doFinal(Cipher.java:1502)
(...)
Caused by: android.security.KeyStoreException: Invalid argument
at android.security.KeyStore.getKeyStoreException(KeyStore.java:940)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:473)
... 12 more
指纹扫描仪显示在DialogFragment
中。无论是否注册或验证指纹,都始终按照构造函数的顺序调用以下函数。
初始化密钥库:
private void initializeKeystore() {
try {
mKeyStore = KeyStore.getInstance(KEY_STORE_NAME); //AndroidKeyStore
} catch (KeyStoreException e) {
mKeyStore = null;
}
try {
mKeyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, KEY_STORE_NAME);
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
mKeyGenerator = null;
}
}
private void createKey() {
if (mKeyGenerator != null) {
try {
mKeyStore.load(null);
KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(KEY_NAME,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setUserAuthenticationRequired(true)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7);
mKeyGenerator.init(builder.build());
mKeyGenerator.generateKey();
} catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException |
CertificateException | IOException e) {
mKeyGenerator = null;
}
}
}
private void createCipher() {
try {
mCipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
+ KeyProperties.BLOCK_MODE_CBC + "/"
+ KeyProperties.ENCRYPTION_PADDING_PKCS7);
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
mCipher = null;
}
}
@Nullable Cipher getCipher(@NonNull final FingerprintStore ivStore) {
if (mKeyStore != null && mKeyGenerator != null && mCipher != null) {
try {
mKeyStore.load(null);
SecretKey key = (SecretKey)mKeyStore.getKey(KEY_NAME, null);
switch (mEncryptionMode) {
case MODE_ENCRYPT:
mCipher.init(Cipher.ENCRYPT_MODE, key);
ivStore.writeIv(mCipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV());
break;
case MODE_DECRYPT:
byte[] iv = ivStore.readIv();
mCipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
break;
}
return mCipher;
} catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException
| NoSuchAlgorithmException | InvalidKeyException | InvalidAlgorithmParameterException
| InvalidParameterSpecException | NullPointerException e) {
return null;
}
}
return null;
}
@Nullable byte[] encryptOrDecrypt(@NonNull Cipher cipher, @NonNull byte[] subject) {
try {
return cipher.doFinal(subject);
} catch (BadPaddingException | IllegalBlockSizeException e) {
e.printStackTrace();
return null;
}
}
没关系,显然我忽略了这样一个事实,即secretkey
应该只在注册阶段生成。因为在试图解密数据时调用了createkey
,所以在调用dofinal
之前,它被新生成的密钥覆盖。代码现在工作得很好。
我有一个文本文件,我已经加密使用移位,但我需要加密加密的文本再次,但这一次使用vigenere密码。然后我需要解密加密的文本(首先是vigenere,然后是Shift),但所有的大小写字母以及黑色空格、引号、逗号和句号都需要保持不变。我已经完成了移位、加密和解密,剩下的就是Vigenere了。下面显示的是我加密Vigenere的类,我还没有写解密,因为我被卡在加密步骤。谢谢你。
这样,从加密消息中扫描进来的第一个字母将对应于换位槽中的第三个槽,这将是它被打印出来的地方。然而,我不知道如何将我的想法转化为代码。 电流换位加密密码: 非常基本的换位解密程序
我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?
问题内容: 我目前正在使用Java创建应用程序,我用Java搜索了密码加密,但是结果是如此巨大,以至于我感到不知所措。如何使用Java加密和解密密码?加密和解密密码的最佳实践是什么?我猜MD5不是一种方法,因为它是一种单向哈希。我使用struts2作为框架,想知道它们是否提供密码加密 问题答案: 更新时间 : 试试JBCrypt: 从此处下载jBCrypt-0.3,有关更多详细信息,请查看READ
获得SHA-1指纹的方法与获得指纹的方法相同吗?以前,我运行的是以下命令: 我不清楚我得到的结果是不是SHA-1指纹。有人能澄清一下吗?
问题内容: 我想用Java加密和解密密码,然后以加密形式存储到数据库中。如果它是开源的,那就太好了。有什么建议/建议吗? 问题答案: 编辑 :这个答案是旧的。现在 不建议 使用MD5,因为它很容易被破坏。 我想象中的MD5必须足够好?您可以使用MessageDigest实现它。 这里还列出了其他算法。 如果确实需要,这是它的第三方版本: Fast MD5