Tag: 加密

在SecretKey上调用.getEncoded()会返回null

我使用以下代码生成AES密钥: KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(“db_enc_key”, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT); KeyGenParameterSpec keySpec = builder .setKeySize(256) .setBlockModes(“CBC”) .setEncryptionPaddings(“PKCS7Padding”) .setRandomizedEncryptionRequired(true) .setUserAuthenticationRequired(true) .setUserAuthenticationValidityDurationSeconds(5 * 60) .build(); KeyGenerator keyGen = KeyGenerator.getInstance(“AES”, “AndroidKeyStore”); keyGen.init(keySpec); SecretKey sk = keyGen.generateKey(); 但每当我尝试通过sk.getEncoded()获取密钥的byte []版本时,该方法返回null。 文档说它应该返回编码的密钥,如果密钥不支持编码,则返回null,但我不认为密钥不支持编码。 我需要byte [],因为我想加密一个领域数据库(我需要将2个AES-256密钥组合为字节数组)[ https://realm.io/docs/java/latest/#encryption] 官方文档使用SecureRandom,但也指出这是一种愚蠢的方式,并且永远不会存储密钥。 因此,我想使用KeyStore安全地存储两个独立的AES-256密钥。 PS:代码只是一个测试代码而不是最终产品,因此对编码风格的任何评论都是无用的。 我目前正试图让一个正在运行的版本。 编辑:所以我尝试了以下代码,它成功生成了一个AES密钥(尽管只有16个字节的长度): SecretKey sk1 = KeyGenerator.getInstance(“AES”).generateKey(); 当我对它使用getEncoded()方法时,我甚至会得到字节数组,所以我自然而然地使用以下代码将其保存到KeyStore: KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(sk1); KeyStore.ProtectionParameter pp […]

用Bouncy Castle复制Java中的’openssl smime’?

我手头有问题。 我的不了解Java的同事正在使用OpenSSL命令对文件进行签名,如下所示: openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem \ -inkey passkey.pem -in manifest.json -out signature -outform DER \ -passin pass:12345 如您所见,这里有三个文件被赋予openssl命令以生成签名。 现在我们想要使用Java复制相同的function,因为我们假设要签名的内容将是动态的,并且本质上是服务器端的。 我读到BouncyCastle是要走的路。 但我不知道如何使用该库。 我对密码技术也不是很熟悉。 我无法理解如何使用上面的所有三个文件来对manifest.json的内容进行签名。 如果有人可以指导我找到正确的代码或给我一个开始,我将非常感谢你的努力。

Android中的字符串加密

我正在使用代码进行加密和加密。 它没有给出字符串结果。 字节数组未转换为字符串。 我尝试了一切几乎将字节数组转换为char但它没有给出结果。 public class EncryptionTest extends Activity { EditText input, output, outputDecrypt; String plain_text; byte[] key, encrypted_bytes,keyStart,byte_char_text,decrpyted_bytes ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_encryption_test); input = (EditText) findViewById(R.id.text_inputText); output = (EditText) findViewById(R.id.text_Result); outputDecrypt = (EditText) findViewById(R.id.text_decrypt_Result); Button encrypt_btn = (Button) findViewById(R.id.btn_encrpyt); Button decrypt_btn = (Button) findViewById(R.id.btn_Decrypt); plain_text = input.getText().toString(); keyStart = […]

Java如何使用私钥文件而不是PEM来解密?

使用Java和Bouncy Castle 1.52,我可以使用以下代码通过PEM证书加载私钥。 我还有一个PKCS8格式的private.key文件。 直接使用private.key文件而不是PEM的代码是什么? String keyPath = “C:\\RSA7\\privatenopass.pem”; BufferedReader br = new BufferedReader(new FileReader(keyPath)); PEMParser pp = new PEMParser(br); PEMKeyPair pemKeyPair = (PEMKeyPair) pp.readObject(); KeyPair kp = new JcaPEMKeyConverter().getKeyPair(pemKeyPair); pp.close(); cipher.init(Cipher.DECRYPT_MODE, kp.getPrivate());

在模数RSA密钥中获得额外1个字节,有时也用于指数

这是我的代码片段: int eValue = 79, t; int bitLength = 1024; // KeySize BigInteger e = new BigInteger(Integer.toString(eValue)); KeyPairGenerator kpg = KeyPairGenerator.getInstance(“RSA”); kpg.initialize(bitLength); KeyPair kp = kpg.generateKeyPair(); KeyFactory kfactory = KeyFactory.getInstance(“RSA”); RSAPublicKeySpec kspec = (RSAPublicKeySpec) kfactory.getKeySpec(kp.getPublic(), RSAPublicKeySpec.class); System.out.println(“Byte Length is : ” + kspec.getModulus().toByteArray().length); String testString; try { testString = new String (kspec.getModulus().toByteArray() , “ISO-8859-1”); StringBuilder […]

Java Cipher – PBE线程安全问题

我似乎有Cipher和/或PBEKeySpec的线程安全问题。 JDK:1.8.0_102,1.8.0_151和9.0.1 + 11 PBKDF2算法:PBKDF2WithHmacSHA1 密码算法:AES / CFB / NoPadding 关键算法:AES 我知道如果我们使用相同的实例,这些类不是安全的,但事实并非如此,我在每次解码时都会得到一个新的实例。 但即便如此,有时解码失败,也没有例外,只是意外的解码值。 我已经能够重现这个问题: @Test public void shouldBeThreadSafe() { final byte[] encoded = { 27, 26, 18, 88, 84, -87, -40, -91, 70, -74, 87, -21, -124, -114, -44, -24, 7, -7, 104, -26, 45, 96, 119, 45, -74, 51 }; final String expected = […]

将源代码隐藏在.jar文件中

可以轻松提取.jar文件并查看源代码。 我想保护源代码不被看到。 一个可能的答案是密码保护文件,就像我们为zip文件做的那样。 但是,如果密码已知,则可以很容易地看到源代码。 有没有办法隐藏源代码,仍然可以运行? 类似于.exe在Windows中的function。 这应该在Windows和Linux环境中运行。

JCEKS keyStore在JavaTM Cryptography Extension中使用的加密..?

在JCEKS密钥存储中使用哪种算法以及密钥的大小是多少。 我找到了一些使用Triple DES东西 但是关键尺寸是多少? 谢谢

如何强制CipherOutputStream完成加密但保持底层流打开?

我有一个由另一个OutputStream支持的CipherOutputStream。 在我将所有需要加密的数据写入CipherOutputStream后,我需要附加一些未加密的数据。 CipherOutputStream的文档说调用flush()不会强制最后一个块脱离加密器; 为此,我需要调用close() 。 但是close()也会关闭底层的OutputStream,我仍然需要写更多内容。 如何在不关闭流的情况下强制最后一个块离开加密器? 我是否需要编写自己的NonClosingCipherOutputStream?

从证书中获取公钥

我正在尝试使用以下方法获取证书的公钥: FileInputStream fin = new FileInputStream(“PathToCertificate”); CertificateFactory f = CertificateFactory.getInstance(“X.509”); X509Certificate certificate = (X509Certificate)f.generateCertificate(fin); PublicKey pk = certificate.getPublicKey(); 但是我收到以下错误: Exception in thread “main” java.lang.ClassCastException: sun.security.x509.X509CertImpl cannot be cast to codec.x509.X509Certificate at sergas_testcertificates.Main.main(Main.java:54) 有谁知道这个错误是什么? 提前致谢