openssl RSA基本加密解密
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/bn.h>
#include <openssl/rsa.h>
#include <openssl/pem.h> int main(int argc, char *argv[])
{
// 产生RSA密钥对
RSA *rsaKey = RSA_generate_key(1024, 65537, NULL, NULL); int keySize = RSA_size(rsaKey); char fData[]="aaabbbccdskjkfd";
char tData[128]; int flen = strlen(fData);
//flen = 15 int ret = RSA_public_encrypt(flen, (unsigned char *)fData, (unsigned char *)tData, rsaKey, RSA_PKCS1_PADDING);
//ret = 128 ret = RSA_private_decrypt(128, (unsigned char *)tData, (unsigned char *)fData, rsaKey, RSA_PKCS1_PADDING);
//ret = 15 RSA_free(rsaKey);
return 0;
}
VC6.0编译通过
RSA_generate_key产生密钥对
参数一:密钥长度是 1024bit (小于1024被认为是不安全的)
参数二:公开的加密指数,通常是一个奇数,一般为3, 17 or 65537
后两个参数,回调函数和回调函数的参数,一般用不着。
RSA结构
struct rsa_st {
/*
* The first parameter is used to pickup errors where this is passed
* instead of aEVP_PKEY, it is set to 0
*/
int pad;
long version;
const RSA_METHOD *meth;
/* functional reference if 'meth' is ENGINE-provided */
ENGINE *engine;
BIGNUM *n;
BIGNUM *e;
BIGNUM *d;
BIGNUM *p;
BIGNUM *q;
BIGNUM *dmp1;
BIGNUM *dmq1;
BIGNUM *iqmp;
...
};
BIGNUM是个什么东西呢?
struct bignum_st {
BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */
int top; /* Index of last used d +1. */
/* The next are internal book keeping for bn_expand. */
int dmax; /* Size of the d array. */
int neg; /* one if the number is negative */
int flags;
};
因为计算机一般是32位或者64位的,表示一个很大的数有困难,所以用这个BIGNUM表示。
这个大数就存在d这块内存里,这块内存的大小是dmax。
TIPS
可以用printf("%s\n", BN_bn2hex(rsaKey->e));
打印出大数,假设这个大数是65537,则打印出来的是010001。
调用函数后,可得到的结构体内容为
- rsaKey 0x00382db8
pad 0
version 0
+ meth 0x1010b350
engine 0x00000000
- n 0x003845b0
- d 0x00384af8
3364328589
top 32
dmax 64
neg 0
flags 1
- e 0x00384610
- d 0x00384730
65537
top 1
dmax 1
neg 0
flags 1
- d 0x003845e0
- d 0x00385158
3055509717
top 32
dmax 32
neg 0
flags 1
+ p 0x00384670
+ q 0x00384640
[MODULES] 模数 n
[PUBLIC EXPONENT] 公钥指数 e
[PRIVATE_EXPONENT] 私钥指数 d
n+e组成公钥
n+d组成私钥
RSA_public_encrypt
参数一:被加密的数据的长度
参数二:被加密数据
参数三:用于存放加密后的数据
参数四:密钥对
参数五:填充方式
RSA_private_decrypt
参数一:被解密的数据的长度
参数二:被解密数据
参数三:用于存放解密后的数据
参数四:密钥对
参数五:填充方式
补充:使用指定数字生成RSA密钥对
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/bn.h>
#include <openssl/rsa.h>
#include <openssl/pem.h> int main(int argc, char *argv[])
{
BIGNUM *bn_e,*bn_n,*bn_d;
RSA *r; //模数
const char *MODULUS="9EC7D9A2DC5B095F8E5F90295121F41262FAEFBE9AF57B772A71F1F9D9635F8769CB78DA2BCFE9B27FC1F3AD4A3D178F8C61981225EF5DEACBDC5665F12E691AA13DDD321A59CFCF376F002036612FF3C5E057A3007FF675AFA3EDE34DC23A1A2637294870EBE823F76B5CE21E25F3FA5137F5DE12437DE0118245B927B28221";
//公钥指数
unsigned long e = 65537;
//私钥指数
const char *PRIVATE="8B26E30ECA6E8F3668F6FA78B0C55FB75A4A3FAD0667B152933A4991D7A815D1498F5E1EF44ACEF6CDF252E56F367DED5BA024DF6B267B7E36BD35552DFA0A4CC1E9D0A4BC8E7C76F98D4971441D6693745A0A76E175571BD160E4B1536A6EFF5A08EDA45236E96E7A4748CF4D031CA8B2F4CCE9F2E1286F432DE6495A535E43"; bn_e = BN_new();
bn_d = BN_new();
bn_n = BN_new();
int ret = BN_set_word(bn_e, e);
BN_hex2bn(&bn_d, PRIVATE);
BN_hex2bn(&bn_n, MODULUS); r = RSA_new();
r->e=bn_e;
r->d=bn_d;
r->n=bn_n; RSA_free(r);
return 0;
}
openssl RSA基本加密解密的更多相关文章
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
(以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...
- openssl Rsa 分段加密解密
密钥长度 1024 openssl genrsa -out rsa_private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out r ...
- OpenSSL - RSA非对称加密实现
非对称加密:即两端使用一对不同的密钥进行加密. 在非对称加密中,需要两对密钥,公钥和私钥. 公钥个私钥属于对立关系,一把加密后,只有另一把才可以进行解密. 公钥数据加密 数字证书内包含了公钥,在进行会 ...
- ios php RSA 非对称加密解密 der 和pem生成
ios 使用public_key.der加密 php 使用 private_key.pem解密 openssl req -x509 -out public_key.der -outform der - ...
- .NET Core 使用RSA算法 加密/解密/签名/验证签名
前言 前不久移植了支付宝官方的SDK,以适用ASP.NET Core使用支付宝支付,但是最近有好几位用户反应在Linux下使用会出错,调试发现是RSA加密的错误,下面具体讲一讲. RSA在.NET C ...
- 支付宝开发(一)-认识php openssl RSA 非对称加密实现
获取支付宝公钥 本地服务器生成私钥和公钥 运用php中openssl相关函数加密解密验证身份 以下是php中openssl相关函数实现的验证,来自php官方demo //需要签名的数据 $data = ...
- RSA算法加密解密
该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1. jar 注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块 ...
- PHP开发接口使用RSA进行加密解密方法
网络安全问题很重要,尤其是保证数据安全,遇到很多在写接口的程序员直接都是明文数据传输,在我看来这是很不专业的.本人提倡经过接口的数据都要进行加密解密之后进行使用. 这篇文章主要介绍使用PHP开发接口, ...
- javascript版前端页面RSA非对称加密解密
最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...
随机推荐
- maven开发工具安装
Maven安装并测试步骤: 1.下载并解压meaven.zip: 2.配置环境变量“M2_HOME”指向meaven安装目录: 3.添加“%M2_HOME%\bin;”到path环境变量中: 4.测试 ...
- 手机端用swiper组件 轮播图设置后右侧出现空白 及 部分手机浏览器打开网页空白
我的方法是设置内容css overflow:hidden;width:100%; ok. 之前搜到一个方法也可以,就是设置css height: auto;overflow-y: scroll; 但是 ...
- 1、list 的一些相关操作 2、增删改查 3、tuple 的操作 4、range
1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 # lst = [1, "周杰伦" ...
- df.dropna()函数和df.ix(),df.at(),df.loc()
- 2018蓝桥杯 全球变暖(dfs)
你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示:........##.....##........##...####....###.. ...
- http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
做了第一个android apk逆向题,很多工具啥的还没用过,再接再厉. 找到方法发现这个apk支持的SDK API是15-17,于是就下载了API 16并制作了模拟器,但发现还是运行不起来, ...
- stm32架构初认识
刚接触stm32f373c8t6的芯片,这到底是怎末开发的,应该说它是SOC,内部有一个核心芯片,然后在芯片的外部添加了一些有特殊功能的外设,使开发者能够完成想要的功能,以stm32f373c 8t6 ...
- CentOS常用的文件操作命令总结
我可以说是linux操作新手,有些命令经常忘记,特别是对文件的某些操作,经常要翻阅之前的笔记,今天把之前在百度上整理的“CentOS常用的文件操作命令”转载到我的新博客上面,以供后面查阅! 博客后面还 ...
- c#: 打开文件夹并选中文件
一.常规方法 给定一个文件路径,打开文件夹并定位到文件,通常所用shell命令为:explorer.exe /select,filepath. c#以进程启动之为: if (File.Exists(f ...
- swift - 根试图控制器的手势返回冲突 - push 新的tabbar控制器手势冲突
1. 禁用手势 和开启手势 extension JYRTSShopListController: UIGestureRecognizerDelegate { /// 禁止使用手势返回 func for ...