当前位置: 首页 > 知识库问答 >
问题:

无法使用对称密钥java解密csv文件

薛望
2023-03-14

我得到了两个加密的文件。enc和加密的_数据。csv。附件。我需要使用我的私钥来解密加密的密钥。enc获取对称密钥,然后使用该对称密钥解密加密的_数据。csv。enc文件。

在终端上,以下命令完成作业:

openssl rsautl -decrypt -ssl -inkey my_private_key -in encrypted_key.enc -out key

openssl aes-256-cbc -d -in encrypted_data.csv.enc -out secret.txt -pass file:key

我的目标是执行两个命令的java等效。我成功地解密了第一个文件并检索了对称密钥。

现在我无法使用对称密钥解密csv文件。我的问题出现在破译中。init(Cipher.DECRYPT_模式,keySpec) 我收到以下堆栈跟踪

线程“main”java中出现异常。安全InvalidKeyException:密钥大小或默认参数非法

我不清楚我在解密过程中到底错过了什么。我试图改变密码提供者,但没有帮助。其他帖子已经发布了使用IVParameterSpec的解决方案,但是我的解密案例似乎不需要它,或者我不知道把它放在哪里。

    File file = new File("my_private_key");
    PrivateKey pk = getPrivateKey(file);

    // Decrypt secret key
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, pk);
    File skFile = new File("encrypted_key.enc");
    FileInputStream fileInputStream = new FileInputStream(skFile);
    byte[] decodedBytes = IOUtils.toByteArray(fileInputStream);
    byte[] original = cipher.doFinal(decodedBytes);
    String decodedOriginal = new String(Base64.encodeBase64(original));
    System.out.println(decodedOriginal);

    // Use the secret key for decrypting file
    File csvFile =
            new File(
                    "encrypted_data.csv.enc");
    FileInputStream csvIS = new FileInputStream(csvFile);
    Cipher decipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKeySpec keySpec = new SecretKeySpec(original, "AES");

    decipher.init(Cipher.DECRYPT_MODE, keySpec);

    byte[] csvOriginal = decipher.doFinal(IOUtils.toByteArray(csvIS));
    String csvContents = new String(csvOriginal);
    System.out.println(csvContents);

共有1个答案

令狐宏浚
2023-03-14
匿名用户

在Java1.8之前(我想,在这附近的某个地方),对于超过128位的密钥大小,您受到Java无限强度策略的限制。这是导致您收到异常的最可能原因。

不幸的是,这无法修复您的代码<带有pass标志的code>openssl使用名为EVP\u BytesToKey()的不安全KDF。Java本机不支持此KDF。您无论如何都不想使用它,因为它是不安全的。更新上游代码以使用更好的KDF,如PBKDF2。Java中对此有本机支持。

此外,在openssl中使用CBC模式,在Java中使用ECB模式。而且您没有在openssl中指定IV。我觉得Java代码不是你自己写的。您可能会从花时间学习和研究代码和正在执行的命令中实际发生的情况中获益,并且您可能会更好地解决问题。

 类似资料:
  • 这是可能的还是加密必须共享和使用相同的密钥? 主要目的就是这样。 我将有两个客户端可以发送和接收加密数据到彼此。

  • 我知道这很难...但我使用OpenSSL以一种非常标准的方式加密文件。该文件使用RSA-2048公钥在AES-256中加密。我想在Java中使用私钥解密文件。我研究了很长时间,尝试了很多方法,但似乎都行不通。我只是找到相关的问题与工作的解决方案,但不是确切地为我的问题。 我使用以下命令生成public-/private-key-pair:

  • MAC( M essage A uessntication C ode)算法是一种对称密钥加密技术,用于提供消息认证。 为了建立MAC过程,发送方和接收方共享对称密钥K. 实质上,MAC是在基础消息上生成的加密校验和,它与消息一起发送以确保消息验证。 使用MAC进行身份验证的过程如下图所示 - 在Java中, javax.crypto包的Mac类提供了消息认证代码的功能。 按照以下步骤使用此类创建

  • 我有作为字符串的公钥和私钥,它们是由Webcrypto API RSA-OAEP算法生成的。我想加密和解密一些纯文本,使用这些和获得异常时,试图转换字符串到字节数组 Java代码: 例外情况: 线程“main”Java.lang.IllegalArgumentException中出现异常:Java.util.base64$Decoder.Decode0(base64.:714)Java.util.

  • 我想获取一段纯文本,一个字节[]形式的对称密钥(来自先前的计算)并输出密文。cipherText=加密(明文本,共享秘密)如何合并纯文本和共享秘密?

  • 我正在尝试将我的应用程序从128位AES密钥升级为256位AES。然而,当我将第54行从128更改为256时,我会得到以下密钥大小错误。 java.security.无效密钥异常: 非法的密钥大小 我已正确安装了JCE文件,我的应用程序生成较长的密钥这一事实证明了这一点。 我在其他文章中看到过“AES / CBC / PKCS7Padding”加密方法,但这只会让我遇到这个例外: