GVKun编程网logo

无法识别AES KeyPairGenerator(无法识别的二维码格式)

31

在本文中,我们将给您介绍关于无法识别AESKeyPairGenerator的详细内容,并且为您解答无法识别的二维码格式的相关问题,此外,我们还将为您提供关于android-已弃用KeyPairGene

在本文中,我们将给您介绍关于无法识别AES KeyPairGenerator的详细内容,并且为您解答无法识别的二维码格式的相关问题,此外,我们还将为您提供关于android-已弃用KeyPairGeneratorSpec、Could not generate DH keypair的问题、Java 8 访问 https 错误:Could not generate DH keypair、java – Android KeyPairGenerator始终生成相同的密钥对的知识。

本文目录一览:

无法识别AES KeyPairGenerator(无法识别的二维码格式)

无法识别AES KeyPairGenerator(无法识别的二维码格式)

我的Java代码有问题。我正在尝试加密文件。但是,当我运行Java代码时,我得到“
java.security.InvalidKeyException:无效的AES密钥长度:162个字节”。

这是代码:

byte[] rawFile;File f = new File("./src/wonkybox.stl");FileInputStream fileReader = new FileInputStream(f);rawFile = new byte[(int)f.length()];fileReader.read(rawFile);/*****   Encrypt the file (CAN DO THIS ONCE!)  ***********///Generate the public/private keysKeyPairGenerator keyGen = KeyPairGenerator.getInstance("AES");SecureRandom random = SecureRandom.getInstance("SHA1PRNG","SUN");keyGen.initialize(1024, random);KeyPair key = keyGen.generateKeyPair();PrivateKey privKey = key.getPrivate();PublicKey pubKey = key.getPublic();//Store the keysbyte[] pkey = pubKey.getEncoded();FileOutputStream keyfos = new FileOutputStream("./CloudStore/keys/pubkey");keyfos.write(pkey);keyfos.close();pkey = privKey.getEncoded();keyfos = new FileOutputStream("./CloudStore/keys/privkey");keyfos.write(pkey);keyfos.close();//Read public/private keysKeyFactory keyFactory = KeyFactory.getInstance("AES");FileInputStream keyfis = new FileInputStream("./CloudStore/keys/pubkey");byte[] encKey = new byte[keyfis.available()];keyfis.read(encKey);keyfis.close();X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);PublicKey pub1Key = keyFactory.generatePublic(pubKeySpec);keyfis = new FileInputStream("./CloudStore/keys/privkey");encKey = new byte[keyfis.available()];keyfis.read(encKey);keyfis.close();PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(encKey);PrivateKey priv1key = keyFactory.generatePrivate(privKeySpec);//Encrypt file using public keyCipher cipher = Cipher.getInstance("AES");System.out.println("provider= " + cipher.getProvider());cipher.init(Cipher.ENCRYPT_MODE, pub1Key);byte[] encryptedFile;encryptedFile = cipher.doFinal(rawFile);//Write encrypted file to ''CloudStore'' folderFileOutputStream fileEncryptOutput = new FileOutputStream(new File("./CloudStore/encrypted.txt"));fileEncryptOutput.write(encryptedFile);fileEncryptOutput.close();

该错误发生在“ KeyPairGenerator keyGen = KeyPairGenerator.getInstance(“ AES”);“行。

答案1

小编典典

AES是一种对称算法,因此KeyPairGenerator不支持使用。要使用AES生成密钥,请致电KeyGenerator

KeyGenerator kgen = KeyGenerator.getInstance("AES");       kgen.init(128);  //set keysize, can be 128, 192, and 256

通过查看代码的其余部分,您似乎正在尝试实现非对称加密(因为调用了它getPublic() andgetPrivate()等),因此我建议您切换到使用RSA或Java支持的任何其他非对称算法。您将大部分likley只需在通话中替换AES为,并且可能会进行一些微调。祝好运RSA``getInstance();

android-已弃用KeyPairGeneratorSpec

android-已弃用KeyPairGeneratorSpec

自API 23开始不推荐使用KeyPairGeneratorSpec.如何处理此警告?

示例代码:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpg.initialize(new KeyPairGeneratorSpec.Builder(context).build());

解决方法:

对于documentation,您应该改用KeyGenParameterSpec.例如(对于RSA签名密钥):

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
        "mykey", KeyProperties.PURPOSE_SIGN)
        .setDigests(KeyProperties.DIGEST_SHA256)
        .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS)
        .build());

需要其他选项来设置摘要和填充模式.这是因为,按照良好的加密安全性惯例,AndroidKeyStore现在将密钥的使用方式(签名与解密,摘要和填充模式等)锁定到指定的集合.如果您尝试以创建密钥时未指定的方式使用密钥,它将失败.此故障实际上是​​由安全硬件强制执行的(如果您的设备具有此功能),因此即使攻击者将设备植根,该密钥仍只能按定义的方式使用.

KeyGenParameterSpec还支持创建ECDSA,AES和HMAC密钥,并允许您对密钥的使用方式设置其他限制.例如,如果使用setUserAuthenticationrequired方法,则除非用户到处进行身份验证,否则将无法使用密钥.

Could not generate DH keypair的问题

Could not generate DH keypair的问题

        今天遇到个问题,找了半天结果居然是jdk的bug,以下是修改内容,记录一下:

Caused by: java.lang.RuntimeException: Could not generate DH keypair

修复方式: 找到Java\jdk1.7.0_79\jre\lib\security\java.security文件

将最后一行jdk.tls.disabledAlgorithms=SSLv3

换成           jdk.tls.disabledAlgorithms=SSLv3,DHE

Java 8 访问 https 错误:Could not generate DH keypair

Java 8 访问 https 错误:Could not generate DH keypair

咋回事啊?说是 Java 8 版本问题?更多的异常是:

Caused by: java.security.NoSuchAlgorithmException: DiffieHellman KeyPairGenerator not available
    at java.security.KeyPairGenerator.getInstance(KeyPairGenerator.java:206)
    at sun.security.ssl.JsseJce.getKeyPairGenerator(JsseJce.java:281)
    at sun.security.ssl.DHCrypt.<init>(DHCrypt.java:125)

升级到最新的 JDK 8u77 也无济于事

java – Android KeyPairGenerator始终生成相同的密钥对

java – Android KeyPairGenerator始终生成相同的密钥对

我正在创建一个为用户生成密钥对的应用程序.但在每个设备中,键都是相同的.这是我的代码:
public KeyPair generateKeys() {
    KeyPair keyPair = null;
    try {
        // get instance of rsa cipher
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(1024);            // initialize key generator
        keyPair = keyGen.generateKeyPair(); // generate pair of keys
    } catch(GeneralSecurityException e) {
        System.out.println(e); 
    }
    return keyPair;
}

并显示生成的密钥代码是:

KeyPair keyPair = rsa.generateKeys();

byte[] publicKey = keyPair.getPublic().getEncoded();
byte[] privateKey = keyPair.getPrivate().getEncoded();
privateText.setText( Base64.encodetoString(privateKey,Base64.NO_WRAP) );
publicText.setText( Base64.encodetoString(publicKey,Base64.NO_WRAP) );

对于每个Android设备,密钥生成仅被调用一次,因此每个设备中的密钥应该是不同的.有人能告诉我我在这里缺少什么吗?

解决方法

我相信你只关注前几位或后几位.我以为我也遇到了同样的问题但是当我看到中间的位时,它们确实是不同的!

今天关于无法识别AES KeyPairGenerator无法识别的二维码格式的讲解已经结束,谢谢您的阅读,如果想了解更多关于android-已弃用KeyPairGeneratorSpec、Could not generate DH keypair的问题、Java 8 访问 https 错误:Could not generate DH keypair、java – Android KeyPairGenerator始终生成相同的密钥对的相关知识,请在本站搜索。

本文标签: