一、openssl 命令
openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin]
[-passin arg] [-sign] [-verify] [-encrypt] [-decrypt] [-hexdump]
选项:
-in file:指定输入文件
-out file:指定输出文件
-inkey file:指定密钥输入文件,默认是私钥文件,指定了"-pubin"则表示为公钥文件,使用"-certin"则表示为包含公钥的证书文件
-pubin:指定"-inkey file"的file是公钥文件
-certin:使用该选项时,表示"-inkey file"的file是包含公钥的证书文件
-passin arg:传递解密密码。若验证签名时实用的公钥或私钥文件是被加密过的,则需要传递密码来解密。密码的格式见"openssl 密码格式"
【功能选项:】
-sign:签名并输出签名结果,注意,该选项需要提供RSA私钥文件
-verify:使用验证签名文件
-encrypt:使用公钥加密文件
-decrypt:使用私钥解密文件
【输出格式选项:】
-hexdump:以hex方式输出
二、生成公钥私钥
1、生成私钥:
openssl genrsa -out genrsa.pri
2、从私钥中提取公钥
openssl rsa -in genrsa.pri -pubout -out rsa.pub
三、用公钥加密,私钥解密
encrypt.sh
#! /bin/sh
# 这个是用公钥加密脚本,对应的是私钥解密
# 需要加密的文件
ENCRYPT_FILE=$1
# 公钥文件
USER_KEY=$2
PWD=`pwd`/
ENCRYPT_FILE_AES=${PWD}${ENCRYPT_FILE}".aes"
URANDOM_STRING_FILE=${PWD}"urandom.key"
URANDOM_STRING_FILE_ENCRYPT=${PWD}"urandom.rsa"
# 加密后生成的文件, 默认pkg结尾
# ENCRYPT_FILE_PKG=${ENCRYPT_FILE}".pkg"
ENCRYPT_FILE_PKG=${PWD}`echo $ENCRYPT_FILE | sed 's/^.*\///' | sed 's/\..*$/_encrypt\.pkg/'`
if [ -f $ENCRYPT_FILE ]; then
echo "start encrypt file: $ENCRYPT_FILE ..."
else
echo "$ENCRYPT_FILE is not exists ! exit."
exit 1
fi
# 随机产生一个key值,并保存到urandom.key
echo "Randomly generate a key value and save it to urandom.key ..."
dd if=/dev/urandom bs=32 count=1 2>/dev/null | hexdump -v -e '/1 "%02X"' > ${URANDOM_STRING_FILE}
echo "openssl -e urandom.key >> urandom.des3 ..."
# 用公钥加密
openssl rsautl -encrypt -in ${URANDOM_STRING_FILE} -inkey ${USER_KEY} -pubin -out ${URANDOM_STRING_FILE_ENCRYPT}
# 加密需要加密的文件,kfile为上面产生的urandom.key
openssl enc -e -aes-256-cbc -in ${ENCRYPT_FILE} -kfile ${URANDOM_STRING_FILE} -out ${ENCRYPT_FILE_AES}
# 将 opensslurandom.key而产生的urandom.des3 和
# openssl 加密文件而产生的ENCRYPT_FILE_AES文件
# 一起放入的一个文件中
# 这里urandom.des3的字节长度为256,解密时要记得
cat ${URANDOM_STRING_FILE_ENCRYPT} ${ENCRYPT_FILE_AES} > ${ENCRYPT_FILE_PKG}
echo "output: ${ENCRYPT_FILE_PKG}"
# 删除不需要的文件
rm -f ${ENCRYPT_FILE_AES} ${URANDOM_STRING_FILE} ${URANDOM_STRING_FILE_ENCRYPT}
echo Done.
exit 0
decrypt.sh
#!/bin/sh
# 这个是私钥解密脚本,对应的是公钥加密的脚本
# 需要解密的文件
ENCRYPT_PKG=$1
# 私钥文件
USER_KEY=$2
FILENAME=`echo $ENCRYPT_PKG | sed 's/^.*\///'`
PWD=`pwd`/
ENCRYPT_FILE_AES=${PWD}${FILENAME}".aes"
URANDOM_STRING_FILE=${PWD}"urandom.key"
URANDOM_STRING_FILE_ENCRYPT=${PWD}"urandom.rsa"
echo ${ENCRYPT_FILE_AES} ${URANDOM_STRING_FILE} ${URANDOM_STRING_FILE_ENCRYPT}
# 解密后的文件默认是 .tar.gz 类型压缩文件
DECRYPT_FILE=${PWD}`echo ${FILENAME} | sed 's/_encrypt.*$/\.tar.gz/'`
if [ -f $ENCRYPT_PKG ]; then
echo "start encrypt file: $ENCRYPT_PKG ..."
else
echo "$ENCRYPT_PKG is not exists ! exit."
exit 1
fi
dd if=${ENCRYPT_PKG} of=$URANDOM_STRING_FILE_ENCRYPT bs=256 count=1
dd if=${ENCRYPT_PKG} of=${ENCRYPT_FILE_AES} bs=256 skip=1
# openssl enc -d -des3 -a -salt -in ${URANDOM_STRING_FILE_ENCRYPT} -kfile ${USER_KEY} -out ${URANDOM_STRING_FILE}
# 用私钥解密
openssl rsautl -decrypt -in ${URANDOM_STRING_FILE_ENCRYPT} -inkey ${USER_KEY} -out ${URANDOM_STRING_FILE}
openssl enc -d -aes-256-cbc -in ${ENCRYPT_FILE_AES} -kfile ${URANDOM_STRING_FILE} -out ${DECRYPT_FILE}
rm -f ${ENCRYPT_FILE_AES} ${URANDOM_STRING_FILE} ${URANDOM_STRING_FILE_ENCRYPT}
echo output: ${DECRYPT_FILE}
echo Done.
exit 0
基本跟上一篇差不多,就openssl enc 改 openssl rsautl 注意一下,还有解密脚本dd命令注意一下。
四、用私钥签名,公钥验证
encrypt_sign.sh
#! /bin/sh
# 这个是用私钥签名脚本,对应的是公钥验证
# 需要加密的文件
ENCRYPT_FILE=$1
# 私钥钥文件
USER_KEY=$2
PWD=`pwd`/
ENCRYPT_FILE_AES=${PWD}${ENCRYPT_FILE}".aes"
URANDOM_STRING_FILE=${PWD}"urandom.key"
URANDOM_STRING_FILE_ENCRYPT=${PWD}"urandom.rsa"
# 加密后生成的文件, 默认pkg结尾
# ENCRYPT_FILE_PKG=${ENCRYPT_FILE}".pkg"
ENCRYPT_FILE_PKG=${PWD}`echo $ENCRYPT_FILE | sed 's/^.*\///' | sed 's/\..*$/_encrypt\.pkg/'`
if [ -f $ENCRYPT_FILE ]; then
echo "start encrypt file: $ENCRYPT_FILE ..."
else
echo "$ENCRYPT_FILE is not exists ! exit."
exit 1
fi
# 随机产生一个key值,并保存到urandom.key
echo "Randomly generate a key value and save it to urandom.key ..."
dd if=/dev/urandom bs=32 count=1 2>/dev/null | hexdump -v -e '/1 "%02X"' > ${URANDOM_STRING_FILE}
echo "openssl -e urandom.key >> urandom.rsa ..."
# 用私钥签名
openssl rsautl -sign -in ${URANDOM_STRING_FILE} -inkey ${USER_KEY} -out ${URANDOM_STRING_FILE_ENCRYPT}
# 加密需要加密的文件,kfile为上面产生的urandom.key
openssl enc -e -aes-256-cbc -in ${ENCRYPT_FILE} -kfile ${URANDOM_STRING_FILE} -out ${ENCRYPT_FILE_AES}
# 将 opensslurandom.key而产生的urandom.des3 和
# openssl 加密文件而产生的ENCRYPT_FILE_AES文件
# 一起放入的一个文件中
# 这里urandom.des3的字节长度为256,解密时要记得
cat ${URANDOM_STRING_FILE_ENCRYPT} ${ENCRYPT_FILE_AES} > ${ENCRYPT_FILE_PKG}
echo "output: ${ENCRYPT_FILE_PKG}"
# 删除不需要的文件
rm -f ${ENCRYPT_FILE_AES} ${URANDOM_STRING_FILE} ${URANDOM_STRING_FILE_ENCRYPT}
echo Done.
exit 0
decrypt_verify.sh
#!/bin/sh
# 这个是公钥验证脚本,对应的是私钥签名的脚本
# 需要解密的文件
ENCRYPT_PKG=$1
# 公钥文件
USER_KEY=$2
FILENAME=`echo $ENCRYPT_PKG | sed 's/^.*\///'`
PWD=`pwd`/
ENCRYPT_FILE_AES=${PWD}${FILENAME}".aes"
URANDOM_STRING_FILE=${PWD}"urandom.key"
URANDOM_STRING_FILE_ENCRYPT=${PWD}"urandom.rsa"
echo ${ENCRYPT_FILE_AES} ${URANDOM_STRING_FILE} ${URANDOM_STRING_FILE_ENCRYPT}
# 解密后的文件默认是 .tar.gz 类型压缩文件
DECRYPT_FILE=${PWD}`echo ${FILENAME} | sed 's/_encrypt.*$/\.tar.gz/'`
if [ -f $ENCRYPT_PKG ]; then
echo "start encrypt file: $ENCRYPT_PKG ..."
else
echo "$ENCRYPT_PKG is not exists ! exit."
exit 1
fi
dd if=${ENCRYPT_PKG} of=$URANDOM_STRING_FILE_ENCRYPT bs=256 count=1
dd if=${ENCRYPT_PKG} of=${ENCRYPT_FILE_AES} bs=256 skip=1
# openssl enc -d -des3 -a -salt -in ${URANDOM_STRING_FILE_ENCRYPT} -kfile ${USER_KEY} -out ${URANDOM_STRING_FILE}
# 用公钥验证
openssl rsautl -verify -in ${URANDOM_STRING_FILE_ENCRYPT} -inkey ${USER_KEY} -pubin -out ${URANDOM_STRING_FILE}
openssl enc -d -aes-256-cbc -in ${ENCRYPT_FILE_AES} -kfile ${URANDOM_STRING_FILE} -out ${DECRYPT_FILE}
rm -f ${ENCRYPT_FILE_AES} ${URANDOM_STRING_FILE} ${URANDOM_STRING_FILE_ENCRYPT}
echo output: ${DECRYPT_FILE}
echo Done.
exit 0
以上每个脚本都有相应的用处,测试基本OK。