当前位置: 首页 > 面试题库 >

会话密钥的OpenSSL加密

濮阳振
2023-03-14
问题内容

我正在写一种加密会话密钥的方法。它需要这样做,以便可以通过已成功测试的其他程序解密密钥。解密程序无法更改。我受困的是使我的加密工作与解密例程保持一致。

首先让我给出解密例程。请记住,这不能改变:

public Boolean decryptSessionKey() {

    // first, base64 decode the session key
    String sslString = "openssl base64 -d -in enc_sesskey -out temp";

    try {
        Process p = Runtime.getRuntime().exec(sslString);
    } catch (IOException e2) {
        e2.printStackTrace();
    }

    // now we can decrypt it
    try {
        sslString = "openssl rsautl -in temp -inkey privkey.pem -decrypt";
        Process p = Runtime.getRuntime().exec(sslString);   
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

        try {
            String s;
            while ((s = stdInput.readLine()) != null) {           
                decrypted_session_password = s;
                writeToFile(decrypted_sesskey, s);
            }
            return true;

        } catch (Exception e) {
            return false;
        }
    } catch (IOException e1) {
        return false;
    } catch (Exception e) {
        return false;
    }
}

这是我正在编写的加密例程。我生成base64编码的文本,但最终无法解密。值得注意的是,我已验证解密例程正确获取了加密例程的结果(两者之间没有握手问题)。

public Boolean encryptSessionKey(Cert receiver_cert) {

    String sslString = 
        "openssl rsautl base64 -in sesskey -out temp -inkey cert.pem -encrypt -certin";

    // run this openssl encryption. Note that it will not yet be base64 encoded
    try {
        Process p = Runtime.getRuntime().exec(sslString);
    } catch (IOException e2) {
        e2.printStackTrace();
    }

    // now we base64-encode the encrypted file
    sslString = "openssl base64 -in temp -out enc_sesskey";

    try {
        Process p = Runtime.getRuntime().exec(sslString);   
    } catch (IOException e1) {return false;
    } catch (Exception e) {return false;
    }

    return true;
}

我真的被卡住了。任何帮助表示赞赏。谢谢。


问题答案:

通过PKCS填充和从证书获取的公钥进行RSA加密:

openssl rsautl -encrypt -in sesskey -inkey cert.pem -certin -out temp
openssl base64 -e -in temp -out enc_sesskey

带有PKCS填充和私钥的RSA解密:

openssl base64 -d -in enc_sesskey -out temp
openssl rsautl -decrypt -in temp -inkey privkey.pem -out sesskey2

经过测试并确认可以,因为“ sesskey”文件的内容与“ sesskey2”文件的内容相同。



 类似资料:
  • 我有这样的情况,我使用OpenSSL生成了一个公钥/私钥对,供gdcmanon使用,遵循他们网站上列出的说明。具体地说,我使用以下命令为gdcmanon生成密钥 然后,我就能够按照他们的指示,加密一个文件,使用 这在c.init(cipher.decrypt_mode,key)行失败; 我已经为Java6安装了JCE(我正在使用)。我不知道我做错了什么。谁能给我指出正确的方向吗。 谢谢

  • 我有一个PGP公钥加密的会话包,我想从中提取会话密钥,这样我就可以单独解密会话密钥。我正在使用BouncyCastle库,并像这样提取会话密钥: 其中session_key_enc.bin是二进制格式的加密会话密钥,private.pem是与我在GPG中用于加密数据的公钥相对应的私钥。在加密数据之前,我将RSA密钥对的公钥部分转换为PGP格式的密钥,并将其导入GPG。 当我运行OpenSSL命令时

  • 我正在尝试将aes-128-cbc加密与openssl一起使用,我希望密钥需要32位。但是,我注意到当我输入密钥长度为18时,openssl不会给我错误。 但是,如果我在密钥后添加0,直到它是32位,我仍然会得到相同的结果。 有文档说OpenSSL给键添加了填充吗? 编辑:我需要在代码中重现此行为。我得到了密钥,但不能保证密钥是多少位数。

  • 我是Openssl的新手,我已经生成了私钥myprivatekey。pem和公钥mypublickey。pem与: 和我的公钥: 接下来我想做的是用通行短语私钥加密我的ecdsa,并对我的公钥进行认证请求,感谢大家的帮助。

  • 我想使用带有RSA算法的OpenSSL使用私钥加密文件: 现在,如果我执行解密操作: 此操作需要私钥 我知道我应该使用公钥进行加密,如果我使用私钥,我会得到一个签名。 然而,我想这样做是为了学习。

  • 我正在尝试使用带有相同密钥和 iv 的 AES 加密相同的文本。我使用 bash 方法和 ruby 的 openssl stdlib,并对加密结果进行 b64 编码。但结果不同!我试图理解为什么。这是我所做的: 红宝石(1.9.3-p448) 砰砰�� -iv参数设置为上面计算的iv_hex值。 ========================================= 我仔细检查了静脉注