liziyu 发布的文章

php读取.cer文件

$certificateCAcerContent = file_get_contents($filePath);
$certificateCApemContent = '-----BEGIN CERTIFICATE-----' . PHP_EOL
. chunk_split(base64_encode($certificateCAcerContent), 64, PHP_EOL)
. '-----END CERTIFICATE-----' . PHP_EOL;

php读取.fpx文件

$pkcs12 = file_get_contents($filePath);
$res = openssl_pkcs12_read($pkcs12, $certs, '密码');

2023年法定节假日

2022-12-31,
2023-01-01,
2023-01-02,
2023-01-21,
2023-01-22,
2023-01-23,
2023-01-24,
2023-01-25,
2023-01-26,
2023-01-27,
2023-04-05,
2023-04-29,
2023-04-30,
2023-05-01,
2023-05-02,
2023-05-03,
2023-06-22,
2023-06-23,
2023-06-24,
2023-09-29,
2023-09-30,
2023-10-01,
2023-10-02,
2023-10-03,
2023-10-04,
2023-10-05,
2023-10-06,

2023年调休

2023-01-28,
2023-01-29,
2023-04-23,
2023-05-06,
2023-06-25,
2023-10-07,
2023-10-08,

//偷懒,从这里获取即可。
https://github.com/zjkal/time-helper/blob/main/src/ChinaHoliday.php

开发银行或海关的项目经常遇到加密解密的问题

一般客户会提供两个文件
.pfx 结尾的(公钥加私钥文件)
.cer 结尾的文件 (包含公钥文件)

私钥一般都是pfx格式(私钥用来加密生成签名发送报文)
公钥是cer格式(公钥用来验证返回报文里的签名)。
但是phpopenssl只能用pem格式,需要把这两个文件转化成pem的:

一、PHP的方式转化

//filePath为pfx文件路径
function signfrompfx($strData, $filePath, $keyPass)
{
    if (!file_exists($filePath)) {
        return false;
    }
    $pkcs12 = file_get_contents($filePath);
    if (openssl_pkcs12_read($pkcs12, $certs, $keyPass)) {
        $privateKey = $certs['pkey'];
        $publicKey = $certs['cert'];
        $signedMsg = "";
        if (openssl_sign($strData, $signedMsg, $privateKey)) {
            $signedMsg = bin2hex($signedMsg);//这个看情况。有些不需要转换成16进制,有些需要base64编码。看各个接口
            return $signedMsg;
        } else {
            return '';
        }
    } else {
        return '0';
    }
}

公钥cer转pem(即x.509证书dem格式转换为pem)

function verifyReturn($data,$signature,$filePath){
    /**
     * filePath为crt,cert文件路径。x.509证书
     * cer to dem, Convert .cer to .pem, cURL uses .pem
     */
    $certificateCAcerContent = file_get_contents($filePath);
    $certificateCApemContent =
        '-----BEGIN CERTIFICATE-----'.PHP_EOL
        .chunk_split(base64_encode($certificateCAcerContent), 64, PHP_EOL)
        .'-----END CERTIFICATE-----'.PHP_EOL;

    $pubkeyid = openssl_get_publickey($certificateCApemContent);

    $len = strlen($signature);
    $signature= pack("H" . $len, $signature); //Php-16进制转换为2进制,看情况。有些接口不需要,有些需要base64解码

    $data=str_replace('<?xml version=\"1.0\" encoding=\"GBK\"?>', '<?xml version="1.0" encoding="GBK"?>', $data);//这个看情况。
    // state whether signature is okay or not
    return openssl_verify($data, $signature, $pubkeyid);
}

二、openssl命令转化

openssl x509 -inform der -in pub.cer -out pub.pem


三、附上截图

20200804133845380.png

转自:https://blog.csdn.net/weixin_38626872/article/details/107784610

PHP

<?php
ini_set("error_reporting","E_ALL & ~E_NOTICE");
header('Content-Type:application/json; charset=utf-8');
if (!function_exists('openssl_encrypt')){
    exit('请开启php.ini的openssl扩展');
}
$input="123456";   //要加密的字符串
$deskey='QDHPJKOS';//算法密钥 
$des = new Des();
$encode=$des->encrypt($input,$deskey);
echo "DES加密结果:".$encode;
$decode=$des->decrypt($encode,$deskey);
echo "\r\nDES解密结果:".$decode;

/**
 * DES加解密类
 */
class Des{
   
    /**
     *
     * 加密函数
     * 算法:des
     * 加密模式:ecb
     * 补齐方法:PKCS5
     *
     * @param unknown_type $input
     */
    public function encrypt($input, $key)
    {
        //由于php7.1废弃了mcrypt_* 一系列函数,所以采用openssl版本
        $str = $this->pkcsPadding($input, 8);
        $key = str_pad($key, 8, '0'); //3DES加密将8改为24
        $sign = @openssl_encrypt($str, 'DES-ECB', $key,OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
        //转为base64,可以有效解决乱码等问题
        $sign = base64_encode($sign);
        return $sign;
    }
    
    /**
     * 解密函数
     * 算法:des
     * 加密模式:ecb
     * 补齐方法:PKCS5
     * @param unknown_type $input
     */
    public function decrypt($input, $key)
    {
        //由于php7.1废弃了mcrypt_* 一系列函数 所以采用openssl版本
        $encrypted = base64_decode($input);
        $key = str_pad($key, 8, '0'); //3DES加密将8改为24
        $sign = @openssl_decrypt($encrypted, 'DES-ECB', $key,OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
        $sign = $this->unPkcsPadding($sign);
        $sign = rtrim($sign);
        return $sign;
    }
    /**
     * 填充
     *
     * @param $text
     * @param $blocksize
     * @return string
     */
    private function pkcsPadding($text, $blocksize)
    {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }
 
     /**
     * 去填充
     * 
     * @param $text
     * @return string
     */
    private function unPkcsPadding($text)
    {
        $pad = ord($text {strlen($text) - 1});
        if ($pad > strlen($text))
            return false;
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
            return false;
        return substr($text, 0, - 1 * $pad);
    }
    
}

JAVA

package demoSys;

import java.security.SecureRandom;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String input = "123456";
        String deskey = "QDHPJKOS";
        String encode = encrypt(input, deskey);
        System.out.println("DES加密结果:" + encode);
        String decode = decrypt(encode, deskey);
        System.out.println("DES解密结果:" + decode);
    }

    public static String encrypt(String souce, String key) {
        try {
            // DES算法要求有一个可信任的随机数源
            SecureRandom sr = new SecureRandom();
            // 从原始密匙数据创建DESKeySpec对象
            DESKeySpec dks = new DESKeySpec(key.getBytes("UTF-8"));
            // 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretkey = keyFactory.generateSecret(dks);
            // Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance("DES");
            // 用密匙初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE, secretkey, sr);
            // 获取数据并加密
            byte encryptedData[] = cipher.doFinal(souce.getBytes("UTF-8"));
            // JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
            // Android平台可以使用android.util.Base64
            return new String(Base64.getEncoder().encode(encryptedData));
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return souce;
        }

    }

    public static String decrypt(String souce, String key) {
        try {
            // DES算法要求有一个可信任的随机数源
            SecureRandom sr = new SecureRandom();
            // 从原始密匙数据创建DESKeySpec对象
            DESKeySpec dks = new DESKeySpec(key.getBytes());
            // 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretkey = keyFactory.generateSecret(dks);
            // Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance("DES");
            // 用密匙初始化Cipher对象
            cipher.init(Cipher.DECRYPT_MODE, secretkey, sr);
            // 将加密报文用BASE64算法转化为字节数组
            byte[] encryptedData = Base64.getDecoder().decode(souce);
            // 用DES算法解密报文
            byte decryptedData[] = cipher.doFinal(encryptedData);
            return new String(decryptedData, "UTF-8");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return souce;
        }

    }

}


系统环境介绍以及准备

查看系统版本

[root@xmg-hk ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

查看openssl版本

[root@xmg-hk ~]# openssl version 
OpenSSL 1.0.2k-fips  26 Jan 2017

官网下载openssl-1.1.1k

其他版本可参考下载: https://www.openssl.org/source/openssl-1.1.1k.tar.gz

cd /usr/local/
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -zcvf openssl-1.1.1k.tar.gz

详细操作步骤

先备份

mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak

进入目录并编译

cd /usr/local/openssl-1.1.1k
./config --prefix=/usr/local/openssl
make && make install

建立链接

ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo “/usr/local/openssl/lib” >> /etc/ld.so.conf
ldconfig -v

查看是否升级成功

[root@xmg-hk ~]# openssl version 
OpenSSL 1.1.1k  25 Mar 2021
说明:需要先进行备份,备份需要在"建立链接"操作以前完成。

转自:https://cloud.tencent.com/developer/article/1907392

一、浏览器四种常见的post请求方式

enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为"application/x-www-form-urlencoded"。
a.png

(1)、HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。
(2)、协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须 使用什么编码方式 。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
(3)、数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。

(1)application/x-www-form-urlencoded

这应该是最常见的 POST 提交数据的方式了。浏览器的原生

表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。

<form action="form_action.asp" enctype="text/plain">
  <p>First name: <input type="text" name="fname" /></p>
  <p>Last name: <input type="text" name="lname" /></p>
  <input type="submit" value="Submit" />
</form>

此时可以看到,

Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式很好的支持,常用的如jQuery中的ajax请求,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8

(2)multipart/form-data

这也是常见的post请求方式,一般用来上传文件,各大服务器的支持也比较好。所以我们使用表单 上传文件 时,必须让表单的enctype属性值为 multipart/form-data.

注意:以上两种方式:application/x-www-form-urlencoded和multipart/form-data都是浏览器原生支持的。

(3)application/json

application/json作为响应头并不陌生,实际上,现在很多时候也把它作为请求头,用来告诉服务端消息主体是序列化的JSON字符串,除了低版本的IE,基本都支持。除了低版本的IE都支持JSON.stringify()的方法,服务端也有处理JSON的函数,使用json不会有任何麻烦。例如:

//请求数据
var data = {name:'jack',sex:'man'};
//请求数据序列化处理
JSON.stingify(data);

//结果:{'name':'jack','sex':'man'};

二、postman的几种参数格式

form-data、x-www-form-urlencoded、raw、binary的区别

1.form-data对应的是页以form表单提交传值的情形

等价于http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;
由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件

POST  HTTP/1.1
Host: test.app.com
Cache-Control: no-cache
Postman-Token: 59227787-c438-361d-fbe1-75feeb78047e
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="filekey"; filename=""
Content-Type: 


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="textkey"

tttttt
------WebKitFormBoundary7MA4YWxkTrZu0gW--

请求体中的boundary参数指定的就是分隔体,可以看到请求内容被分为了两段,第一段对应filekey,第二段对应textkey。

2. x-www-form-urlencoded

即application/x-www-from-urlencoded,将表单内的数据转换为Key-Value。

POST  HTTP/1.1
Host: test.app.com
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: e00dbaf5-15e8-3667-6fc5-48ee3cc89758

key1=value1&key2=value2
  • form-data与x-www-form-urlencoded的区别
  • multipart/form-data:可以上传文件或者键值对,最后都会转化为一条消息
  • x-www-form-urlencoded:只能上传键值对,而且键值对都是通过&间隔分开的

3.raw对应的是入参是任意格式的可以上传任意格式的【文本】,可以上传text、json、xml、html等

b.png

(4)binary

相当于Content-Type:application/octet-stream,只可以上传二进制数据,通常用来上传文件,但是一次只能上传一个文件

c.png

响应

1.点击 Send 即可发送请求
在下面的response模块显示返回信息
d.png

转自:https://www.cnblogs.com/h-c-g/p/11002380.html

操作流程为:

生成RSA密钥key.pem(也称私钥,密钥对)。
从key.pem中导出公钥pubkey.pem。
使用公钥pubkey.pem对文件test.txt进行加密,得到密文test.enc。
使用私钥key.pem对test.enc进行解密,得到译文test.dec。
对比test.txt和test.dec,应该是一样的。
使用key.pem对test.txt进行签名,得到test.sig。
使用pubkey.pem对test.txt的签名test.sig进行验签。

key.pem ====导出=====> pubkey.pem
pubkey.pem + text.txt ===公钥加密===> test.enc
key.pem + test.enc ===私钥解密===> test.dec
key.pem + test.txt ===私钥签名===> test.sig
pubkey.pem + test.txt + test.sig ==> 验证签名

命令如下:

1. 生成密钥对并导出公钥

# 生成密钥对
openssl genrsa -out key.pem

# 导出公钥
openssl rsa -in key.pem -pubout -out pubkey.pem

参数说明:

-out: 指定输出的文件
-in: 指定输入的文件
-pubout: 指定输出公钥。如果不加该参数,默认输出的为私钥

2. 加解密操作

# 生成一个待加密的测试文件
echo "hello, world" > test.txt
# 公钥加密
openssl rsautl -encrypt -pubin -inkey pubkey.pem -in test.txt -out test.enc
openssl rsautl -decrypt -inkey key.pem -in test.enc -out test.dec

参数说明:

-encrypt: 加密操作
-decrypt: 解密操作
-pubin: 指定输入公钥。如果不加该参数,则认为输入的为私钥
-inkey: 密钥文件

核对文件

# 如果没有任何输出,则文件相同
cmp test.txt test.dec

3. 签名、验签

# 签名
openssl dgst -sign key.pem -sha256 -out test.sig test.txt
# 验签
openssl dgst -verify pubkey.pem -sha256 -signature test.sig test.txt

参数说明:

-sign: 使用私钥签名
-verify: 使用公钥验签
-sha256: 摘要算法,也可以为md5/sha1/sha384/sha512等,签名验签使用的摘要算法应相同
-signature: 待验证的签名文件

4. 查看密钥信息

# 查看私钥信息
openssl rsa -in key.pem -noout -text

# 查看公钥信息
openssl rsa -pubin -in pubkey.pem -noout -text

参数说明:

-noout: 不打印密钥数据
-text: 以文本方式打印密钥信息

转自:https://segmentfault.com/a/1190000018084284

openssl

强大的安全套接字层密码库

补充说明

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。在OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用名为OpenSSL的开源软件包。由于这是互联网应用最广泛的安全传输方法,被网银、在线支付、电商网站、门户网站、电子邮件等重要网站广泛使用,所以该漏洞影响范围广大。

OpenSSL有两种运行模式:交互模式和批处理模式。

直接输入openssl回车进入交互模式,输入带命令选项的openssl进入批处理模式。

OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

对称加密算法

OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。

非对称加密算法

OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用于密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。

信息摘要算法

OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。

密钥和证书管理

密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。

首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。

在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。

事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。

实例

1、使用 openssl 生成密码

几乎所有 Linux 发行版都包含 openssl。我们可以利用它的随机功能来生成可以用作密码的随机字母字符串。

openssl rand -base64 10
# nU9LlHO5nsuUvw==

nU9LlHO5nsuUvw==

2、消息摘要算法应用例子

用SHA1算法计算文件file.txt的哈西值,输出到stdout:

# openssl dgst -sha1 file.txt

用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt:

# openssl sha1 -out digest.txt file.txt

用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin。签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中。

# openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt

用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem。

# openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem。

# openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

用sha1算法验证file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。

# openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

3、对称加密应用例子

对称加密应用例子,用DES3算法的CBC模式加密文件plaintext.doc,加密结果输出到文件ciphertext.bin。

# openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin

用DES3算法的OFB模式解密文件ciphertext.bin,提供的口令为trousers,输出到文件plaintext.doc。注意:因为模式不同,该命令不能对以上的文件进行解密。

# openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers

用Blowfish的CFB模式加密plaintext.doc,口令从环境变量PASSWORD中取,输出到文件ciphertext.bin。

# openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD

给文件ciphertext.bin用base64编码,输出到文件base64.txt。

# openssl base64 -in ciphertext.bin -out base64.txt

用RC5算法的CBC模式加密文件plaintext.doc,输出到文件ciphertext.bin,salt、key和初始化向量(iv)在命令行指定。

# openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29

4、Diffie-Hellman应用例子

使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数,输出保存到文件dhparam.pem

# openssl dhparam -out dhparam.pem -2 1024

从dhparam.pem中读取Diffie-Hell参数,以C代码的形式,输出到stdout。

# openssl dhparam -in dhparam.pem -noout -C

5、DSA应用例子应用例子

生成1024位DSA参数集,并输出到文件dsaparam.pem。

# openssl dsaparam -out dsaparam.pem 1024

使用参数文件dsaparam.pem生成DSA私钥匙,采用3DES加密后输出到文件dsaprivatekey.pem

# openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem

使用私钥匙dsaprivatekey.pem生成公钥匙,输出到dsapublickey.pem

# openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem

从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,然后写回文件dsaprivatekey.pem

# openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin

6、RSA应用例子

产生1024位RSA私匙,用3DES加密它,口令为trousers,输出到文件rsaprivatekey.pem

# openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

从文件rsaprivatekey.pem读取私匙,用口令trousers解密,生成的公钥匙输出到文件rsapublickey.pem

# openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem

用公钥匙rsapublickey.pem加密文件plain.txt,输出到文件cipher.txt

# openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt

使用私钥匙rsaprivatekey.pem解密密文cipher.txt,输出到文件plain.txt

# openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt

用私钥匙rsaprivatekey.pem给文件plain.txt签名,输出到文件signature.bin

# openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin

用公钥匙rsapublickey.pem验证签名signature.bin,输出到文件plain.txt

# openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain

从X.509证书文件cert.pem中获取公钥匙,用3DES加密mail.txt,输出到文件mail.enc

# openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

从X.509证书文件cert.pem中获取接收人的公钥匙,用私钥匙key.pem解密S/MIME消息mail.enc,结果输出到文件mail.txt

# openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt

cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,证书被包含在S/MIME消息中,输出到文件mail.sgn

# openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn

验证S/MIME消息mail.sgn,输出到文件mail.txt,签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中

# openssl smime -verify -in mail.sgn -out mail.txt

更多实例:

openssl version -a
openssl help
openssl genrsa -aes128 -out fd.key 2048 # pem format
openssl rsa -text -in fd.key