我对加密和解密的东西有点陌生。而且我发现很难找到关于它的好材料或教程。我在StackOverflow中浏览了与之相关的问题,但没有找到一个好的答案。
这是我的问题,如果我想通过转换进行加密和解密:
“AES/GCM/无填充”
我可以做以下事情吗
public DaoEncryptionResult<byte[]> getEncryptionResult(final ByteBuffer bufferToEncrypt) {
try {
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
final SecretKey secretKey = new SecretKeySpec(BinaryKey, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, mSecureRandom);
final byte[] bytesToEncrypt = bufferToEncrypt.array();
final byte[] cipherText = cipher.doFinal(bytesToEncrypt,
bufferToEncrypt.arrayOffset(), bufferToEncrypt.limit());
final byte[] iv = cipher.getIV();
return new DaoEncryptionResult<>(cipherText, iv);
} catch (final GeneralSecurityException securityException) {
throw new RuntimeException("Could not encrypt data", securityException);
}
}
public byte[] getDecryptionResult(final byte[] encodedData, final byte[] encodedIv) {
try {
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
final SecretKey secretKey = new SecretKeySpec(BinaryKey, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(encodedIv));
return cipher.doFinal(encodedData);
} catch (final GeneralSecurityException securityException) {
throw new RuntimeException("Could not decrypt data", securityException);
}
}
mSecureRandom在整个应用程序生命周期中通过调用
新安全随机()
BinaryKey是一个byte[],由Base64从带有Base64的字符串解码而来。系统默认值
encodedData和encodedIv将与getEncryptionResult方法中返回的结果相同。
通过这样做,我总是发现一些与解密问题相关的异常。例如:
javax.crypto.BadPaddingException: mac check in GCM failed
at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:854)
at javax.crypto.Cipher.doFinal(Cipher.java:1340)
at com.amazon.rabbit.android.data.dao.DaoEncryptionManagerImpl.getDecryptionResult(DaoEncryptionManagerImpl.java:250)
由于长度和格式,作为答案提供,回答评论:(关于加密和解密的好材料,你能分享链接吗)
有书:
这本书的免费PDF:Alfred j . menez es,Paul C. van Oorschot和Scott A. Vanstone的《应用密码学手册》,参见免费下载。章是当前密码的一个合理的开始。
密码学解密:H. X. Mel和Doris M. Baker(我真的很喜欢的好入门)
Bruce Schneier的应用密码学
密码学工程:Niels Ferguson、Bruce Schneier 和 Tadayoshi Kohno
网上还有一些很好的免费课程,比如Coursera和Udacity。
我想知道为什么人们似乎不使用GraphQL jus与Redux。 我以前从未使用过GraphQL,但我想开始一个新项目,但阿波罗和继电器都不能说服我。目前,我正在创建一个使用react和redux以及“老式”RESTAPI的应用程序。我喜欢redux的想法,它将我的应用程序的全部信息存储在一个地方。 现在,据我所知,阿波罗和中继都做了类似的事情,但它们使用单独的存储,在这两者中,我们混合了逻辑和视
适用于类的语法不适用于概念: MSVC对“专门化”一行说:。 为什么概念不能专门化?有理论上的原因吗?
我试图理解为什么我们不能覆盖静态和最终方法。我不明白背后的目的。
我需要做以下工作 那么我怎样才能做到这一点呢。任何建议,谢谢。
有三种典型的情况适合使用智能指针: 资源所有权的共享 要编写异常安全的代码时 避免常见的错误,如资源泄漏 共享所有权是指两个或多个对象 需要同时使用第三个对象的情况。这第三个对象应该如何(或者说何时)被释放?为了确保释放的时机是正确的,每个使用这个共享资源的对象必须互相知道对方, 才能准确掌握资源的释放时间。从设计或维护的观点来看,这种耦合是不可行的。更好的方法是让这些资源所有者将资源的生存期管理
考虑以下代码: 导出返回类型,并将用作尾部返回类型 下面的代码是一个稍加修改的版本(实际上是sfinae版本): 如果你参加了这个功能的考试: 问题是:是否可以使用尾随返回类型来执行sfinae,并且仍然可以推断返回类型 我指的是下面的代码(当然不起作用): 注意:我不是在寻找涉及模板参数的替代方法,我知道它们,我只是想知道这是否是一个可行的解决方案。
我无法停止/消除我的不和。js机器人(nodejs-npm)。 并尝试命令:npm stop https://pastebin.com/v41PxTcN
我在用Android Studio。我试图导入javax.swing.;对于登录页面,所以我尝试编写一个语句来导入,即导入javax.swing.;。 但什么也没发生,这句话让人绝望。 你能教我怎么解决这个问题吗?