給檔案加解密(openssl 實現)(二)公鑰私鑰加解密
阿新 • • 發佈:2021-01-14
技術標籤:opensslLinux 命令工具shellopenssllinux
一、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。