最近在弄音视频上云,参考了腾讯云中SecretId和SecretKey,直观理解SecretKey是私钥,用于签名,然后公钥验证签名,个人理解SecretId在腾讯云系统里面有一条记录,此记录存放着公钥信息。

关于公钥,私钥,一般认为是公钥加密,私钥解密;私钥签名,公钥验签,如下所示:

生成公钥私钥
openssl genrsa -out RSAPrivateKey.pem  1024
openssl rsa -in RSAPrivateKey.pem -out RSAPublicKey.pem -pubout公钥加密
openssl rsautl -encrypt -in hello.txt -inkey RSAPublicKey.pem -pubin -out hello.txt.encrypt
私钥解密
openssl rsautl -decrypt -in hello.txt.encrypt -inkey RSAPrivateKey.pem -out hello.txt.decrypt私钥签名
openssl dgst -sha1 -sign RSAPrivateKey.pem -out sign.txt.signed sign.txt
公钥验签
openssl dgst -sha1 -verify RSAPublicKey.pem -signature sign.txt.signed sign.txt

关于openssl,没有提供关于私钥加密,公钥解密的命令行,但是却有相关的函数。
私钥签名本身是个加密过程,公钥验签也存在着解密过程。

rsa加密时,有六个重要的数:
质数:p
质数:q
模数:n=pq
欧拉函数:ϕ\phiϕ(n)=(p-1)
(q-1)
公钥指数e:其中e满足1<e<ϕ\phiϕ(n),并且e与ϕ\phiϕ(n)互质
私钥指数d:满足ed ≡\equiv≡ 1(mod ϕ\phiϕ(n))

例如,取p=3,q=11,则n=33,ϕ\phiϕ(n)=20,取e=3,计算出d=7。

首先给出例子,公钥加密,私钥解密:
取明文m=2,利用加密公式me ≡\equiv≡ c(mod n),将m=2,e=3,n=33代入公式,得到
23 ≡\equiv≡ c(mod 33),求得密文c=8。

然后再利用解密公式cd ≡\equiv≡ m2(mod n),将c=8,d=7,n=33代入公式,得到
87 ≡\equiv≡ m2(mod 33),求得明文m2=2

如下是代码展示,applink.c是openssl中自带的c文件,需要将此c文件拷贝到头文件下,否则执行时会出问题。

// OpensslTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <openssl/pem.h>
#include <openssl/rsa.h>#ifdef __cplusplusextern "C" {#endif#include <openssl/applink.c>#ifdef __cplusplus
}#endifint main()
{// 原始明文unsigned char plain[256] = "hello123";// 用来存放密文unsigned char encrypted[1024];// 用来存放解密后的明文unsigned char decrypted[1024];// 公钥和私钥文件const char* pub_key = "RSAPublicKey.pem";const char* priv_key = "RSAPrivateKey.pem";// -------------------------------------------------------// 利用公钥加密明文的过程// -------------------------------------------------------// 打开公钥文件FILE* pub_fp = fopen(pub_key, "r");if (pub_fp == NULL) {printf("failed to open pub_key file %s!\n", pub_key);return -1;}// 从文件中读取公钥RSA* rsa1 = PEM_read_RSA_PUBKEY(pub_fp, NULL, NULL, NULL);//RSA* rsa1 = PEM_read_RSAPublicKey(pub_fp, NULL, NULL, NULL);if (rsa1 == NULL) {printf("unable to read public key!\n");return -1;}/*if (strlen(plain) >= RSA_size(rsa1) - 41) {printf("failed to encrypt\n");return -1;}*/fclose(pub_fp);int iLenPlain = strlen((const char *)plain);// 用公钥加密int len = RSA_public_encrypt(iLenPlain, plain, encrypted, rsa1, RSA_PKCS1_PADDING);if (len == -1) {printf("failed to encrypt\n");return -1;}// 输出加密后的密文FILE* fp = fopen("out.txt", "w");if (fp) {fwrite(encrypted, len, 1, fp);fclose(fp);}// -------------------------------------------------------// 利用私钥解密密文的过程// -------------------------------------------------------// 打开私钥文件FILE* priv_fp = fopen(priv_key, "r");if (priv_fp == NULL) {printf("failed to open priv_key file %s!\n", priv_key);return -1;}// 从文件中读取私钥RSA *rsa2 = PEM_read_RSAPrivateKey(priv_fp, NULL, NULL, NULL);if (rsa2 == NULL) {printf("unable to read private key!\n");return -1;}// 用私钥解密len = RSA_private_decrypt(len, encrypted, decrypted, rsa2, RSA_PKCS1_PADDING);if (len == -1) {printf("failed to decrypt!\n");return -1;}fclose(priv_fp);// 输出解密后的明文decrypted[len] = 0;printf("%s\n", decrypted);return 0;
}

下面再给出私钥加密,公钥解密的例子,如下:
取明文m=2,利用加密公式md ≡\equiv≡ c(mod n),将m=2,d=7,n=33代入公式,得到
27 ≡\equiv≡ c(mod 33),求得密文c=29。

然后再利用解密公式ce ≡\equiv≡ m2(mod n),将c=29,e=3,n=33代入公式,得到
293 ≡\equiv≡ m2(mod 33),求得明文m2=2

// OpensslTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <openssl/pem.h>
#include <openssl/rsa.h>#ifdef __cplusplusextern "C" {#endif#include <openssl/applink.c>#ifdef __cplusplus
}#endifint main()
{// 原始明文unsigned char plain[256] = "hello123";// 用来存放密文unsigned char encrypted[1024];// 用来存放解密后的明文unsigned char decrypted[1024];// 公钥和私钥文件const char* pub_key = "RSAPublicKey.pem";const char* priv_key = "RSAPrivateKey.pem";// 打开公钥文件FILE* pub_fp = fopen(pub_key, "r");if (pub_fp == NULL) {printf("failed to open pub_key file %s!\n", pub_key);return -1;}// 从文件中读取公钥RSA* rsa1 = PEM_read_RSA_PUBKEY(pub_fp, NULL, NULL, NULL);//RSA* rsa1 = PEM_read_RSAPublicKey(pub_fp, NULL, NULL, NULL);if (rsa1 == NULL) {printf("unable to read public key!\n");return -1;}fclose(pub_fp);/*if (strlen(plain) >= RSA_size(rsa1) - 41) {printf("failed to encrypt\n");return -1;}*/// 打开私钥文件FILE* priv_fp = fopen(priv_key, "r");if (priv_fp == NULL) {printf("failed to open priv_key file %s!\n", priv_key);return -1;}// 从文件中读取私钥RSA *rsa2 = PEM_read_RSAPrivateKey(priv_fp, NULL, NULL, NULL);if (rsa2 == NULL) {printf("unable to read private key!\n");return -1;}fclose(priv_fp);int iLenPlain = strlen((const char *)plain);// 用私钥加密int len = RSA_private_encrypt(iLenPlain, plain, encrypted, rsa2, RSA_PKCS1_PADDING);if (len == -1) {printf("failed to encrypt\n");return -1;}// 输出加密后的密文FILE* fp = fopen("out.txt", "w");if (fp) {fwrite(encrypted, len, 1, fp);fclose(fp);}// 用公钥解密len = RSA_public_decrypt(len, encrypted, decrypted, rsa1, RSA_PKCS1_PADDING);if (len == -1) {printf("failed to decrypt!\n");return -1;}// 输出解密后的明文decrypted[len] = 0;printf("%s\n", decrypted);return 0;
}

openssl公钥加密私钥解密和私钥加密公钥解密相关推荐

  1. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  2. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

  3. 公钥加密私钥解密私钥加密公钥解密

    公钥加密体制 1.公钥加密体制用于保密性时,就是公钥加密,私钥解密. 因为公钥是可以公开了, 那么任何人都可以使用公钥对信息进行加密,但是只有持有私钥的人才能正确解密.这样就保证了信息的保密性,因为只 ...

  4. 非对称加密 公钥解密_了解非对称公钥加密

    非对称加密 公钥解密 Asymmetric cryptography, also called public key cryptography, is an essential element of ...

  5. java中完成md5加密解密_java实现md5加密解密 notNET中加密和解密的实现方法

    java实现md5加密解密 notNET中加密和解密的实现方法 亦或是旅途风光 7-14 1918℃ 22 [ ee21.cn - ASP.NET ] .NET将原来独立的API和SDK合并到一个框架 ...

  6. C#实现RSA公钥加密私钥解密、私钥加密公钥解密以及Pcks12、X509证书加解密、签名验签

    RSA的私钥签名公钥验签可以见 http://blog.csdn.net/starfd/article/details/51917916,所以这里就没提供对应代码,具体代码如下: using Org. ...

  7. RSA双向加解密(公钥加密-私钥解密;私钥加密-公钥解密)

    非对称加密算法中,提供一个公钥一个私钥.一般情况下,采用公钥加密.私钥解密的方式. 假设有这样一个场景:服务A与服务B需要通信,通信内容为了安全需要进行加密传输,并且服务A与服务B不能互相持有对方的钥 ...

  8. 关于js私钥加密公钥解密的问题

    博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考 一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签.但总有特别的时候会想要用私钥加密,公钥解密,但是j ...

  9. C#.NET Rsa私钥加密公钥解密

    在C#中,RSA私钥只能签名,不能加密,如果要加密,要借助BouncyCastle库. nuget 中引用 Portable.BouncyCastle. 工具类: RsaEncryptUtil usi ...

最新文章

  1. selenium webdriver python 环境搭建
  2. 微信iOS版更新:可批量管理不常联系的朋友
  3. customize shell prompt
  4. (转)DirectShow9在VS2005或vc6.0下编译出现问题的解决方法
  5. CentOS6.5安装MySQL5.7详细教程
  6. 小米9首次官方降价:2799元,依旧实力强劲
  7. 用android手机测量身高,教你如何使用小米手机测量自己的身高!
  8. Lempel-Ziv压缩算法
  9. 图解 OSPF :什么是 LSA ?
  10. kubernetes如何解决服务依赖呢?
  11. 装机员系统下载合集(五月更新发布)!
  12. Windows开启IIS服务器,并发布网站
  13. 【微信小程序】1、SpringBoot整合WxJava开启消息推送
  14. 学生管理系统详细架构
  15. 成就亿万富翁的10条规则
  16. 图像处理领域的大牛(转载收藏)
  17. 短视频程序源码,实现ios系统的短视频缓存
  18. mac下的python程序使用pyinstall打包
  19. 计算机网络拓扑图ppt,《计算机网络拓扑结构》.ppt
  20. ubuntu16.04 自定义fctix输入法

热门文章

  1. python透明的桌面时钟_透明桌面时钟-透明桌面时钟下载 v2018.07.16免费版--pc6下载站...
  2. 如何在编译内核时添加缺少的固件(以intel wireless 5100 AGN的 iwlwifi 为例)
  3. 【RobotFramework自动化测试】
  4. LDR 和 GDR以及QFE 的区别
  5. Liquid Telecom推出泛非Wi-Fi漫游枢纽
  6. 记录01-FreeModbus移植入stm32单片机,以及遇到的问题
  7. OpenGL-非均匀有理B样条
  8. SILVACO TCAD 软件使用参考
  9. uniapp做h5页面刷新页面404配置nginx后端开启伪静态
  10. 端口(port)和插口(socket)的区别