繁体   English   中英

相当于java解密代码的openssl(shell脚本)

[英]Openssl (shell script) equivalent of java decryption code

需要有关 openssl 的帮助,以下 java 方法的 openssl 等价物是什么?

private static String decryptString(String value, String myKey) {

    MessageDigest sha = null;
    SecretKeySpec secretKey = null;
    try {
        byte[] key = myKey.getBytes("UTF-8");
        sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16); // use only first 128 bit
        secretKey = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return (new String(cipher.doFinal(Base64.decodeBase64(value))));
    } catch (Exception e) {
        System.out.println("Error while decrypting: " + e.toString());
    }
    return null;
}

该函数使用 SHA-1 对字符串 (myKey) 进行摘要,然后使用结果摘要的前 16 个字节作为 AES128-ECB 解密操作的密钥。 在解密之前,密文首先被base64解码。

要使用 SHA-1 消化字符串,请使用此处的代码: https : //wiki.openssl.org/index.php/EVP_Message_Digests

该代码实际上使用 SHA-256。 要使其执行 SHA-1, EVP_sha256()的实例替换为EVP_sha1() 结果的前 16 个字节是您的“密钥”。

接下来,输入“值”被 base64 解码。 这里有一些示例代码可以使用 OpenSSL 做到这一点:

http://www.ioncannon.net/programming/122/howto-base64-decode-with-cc-and-openssl/

最后,要进行 AES-ECB 解密操作,请使用此处的代码:

https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption#Decrypting_the_Message

该代码使用的是 AES256-CBC。 让它做AES128-ECB而不是取代的实例EVP_aes_256_cbc()EVP_aes_128_ecb() key参数如您上面计算的那样。 ECB 的iv参数只是 NULL。 密文是您在上面计算的 base64 解码数据。 请注意,Java 代码的“PKCS5PADDING”部分无论如何都是 OpenSSL 中的默认值,因此无需为此做任何特殊处理。

解密操作输出的明文是 Java 函数的返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM