给文件加解密(openssl 实现)(二)公钥私钥加解密

一、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。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA是一种非对称加密算法,其公钥私钥是成对生成的。以下是RSA生成公钥私钥以及加解密的步骤: 1. 生成RSA公钥私钥: 首先需要随机生成两个大素数p和q,计算n = p * q,再选取一个整数e(一般为65537),计算d = e^-1 mod ((p-1) * (q-1))。 生成的公钥为(n, e),私钥为(n, d)。 2. RSA加密: 假设要将明文M加密为密文C,使用公钥(n, e)进行加密,计算C = M^e mod n。 3. RSA解密: 使用私钥(n, d)进行解密,计算M = C^d mod n。 以下是一个简单的RSA加解密的C语言实现示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/bio.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main() { // 生成RSA公钥私钥 RSA *rsa = RSA_generate_key(2048, 65537, NULL, NULL); if (rsa == NULL) { printf("Failed to generate RSA key pair.\n"); return -1; } // 获取公钥私钥 BIO *pubBio = BIO_new(BIO_s_mem()); BIO *priBio = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPublicKey(pubBio, rsa); PEM_write_bio_RSAPrivateKey(priBio, rsa, NULL, NULL, 0, NULL, NULL); // 获取公钥私钥字符串 char pubKey[1024] = {0}; char priKey[4096] = {0}; BIO_read(pubBio, pubKey, sizeof(pubKey)); BIO_read(priBio, priKey, sizeof(priKey)); // 输出公钥私钥 printf("Public Key:\n%s\n", pubKey); printf("Private Key:\n%s\n", priKey); // 加密明文 char *plaintext = "Hello World!"; int plaintextLen = strlen(plaintext) + 1; char ciphertext[4096] = {0}; int ciphertextLen = RSA_public_encrypt(plaintextLen, (unsigned char *)plaintext, (unsigned char *)ciphertext, rsa, RSA_PKCS1_PADDING); if (ciphertextLen == -1) { printf("Failed to encrypt plaintext.\n"); return -1; } // 输出密文 printf("Ciphertext:\n"); for (int i = 0; i < ciphertextLen; i++) { printf("%02x", ciphertext[i]); } printf("\n"); // 解密密文 char decrypted[4096] = {0}; int decryptedLen = RSA_private_decrypt(ciphertextLen, (unsigned char *)ciphertext, (unsigned char *)decrypted, rsa, RSA_PKCS1_PADDING); if (decryptedLen == -1) { printf("Failed to decrypt ciphertext.\n"); return -1; } // 输出解密后的明文 printf("Decrypted plaintext: %s\n", decrypted); // 释放资源 RSA_free(rsa); BIO_free_all(pubBio); BIO_free_all(priBio); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值