1. 程式人生 > 其它 >給檔案加解密(openssl 實現)(二)公鑰私鑰加解密

給檔案加解密(openssl 實現)(二)公鑰私鑰加解密

技術標籤: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。