RSA加密:利用模数和指数生成公钥加密
2014-08-21 00:16
260 查看
引子
目前做一款金融产品,由于涉及到资金安全,采用动态公钥的方式,即客户端每次登录服务端返回一个不同的XML串,由公钥的模数和指数构成,我需要用这个串生成公钥加密相关信息。
服务端返回的XML串形如:
View Code
生成pem文件之后可以从pem文件里面读取公钥加密相关信息。
最后封装了一下,放在github上:https://github.com/yrs244742688/GeneratePemWithMoAndEx
注解
ASN.1:ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指 代,也不用去管到底是什么样的应用程序。标准的ASN.1编码规则有基本编码规则(BER,Basic Encoding Rules)、规范编码规则(CER,Canonical Encoding Rules)、唯一编码规则(DER,Distinguished Encoding Rules)、压缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。
x.509 : 常见通用的证书格式。
der:DER是ASN.1编码规则的其中一种。x.509证书通过DER编码(ASCII)后缀是:.DER .CER .CRT,通过PAM编码(Base64)的后缀是:.PEM .CER .CRT。.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
pem文件 : der文件经过base64转码后的文件。
@mic
(Email:yrs244742688@gmail.com)
(QQ:839720759)
目前做一款金融产品,由于涉及到资金安全,采用动态公钥的方式,即客户端每次登录服务端返回一个不同的XML串,由公钥的模数和指数构成,我需要用这个串生成公钥加密相关信息。
服务端返回的XML串形如:
unsigned char *base64_decode(const char* base64data, int* len) { BIO *b64, *bmem; size_t length = strlen(base64data); unsigned char *buffer = (unsigned char *)malloc(length); b64 = BIO_new(BIO_f_base64()); BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); bmem = BIO_new_mem_buf((void*)base64data, length); bmem = BIO_push(b64, bmem); *len = BIO_read(bmem, buffer, length); BIO_free_all(bmem); return buffer; } BIGNUM* bignum_base64_decode(const char* base64bignum) { BIGNUM* bn = NULL; int len; unsigned char* data = base64_decode(base64bignum, &len); if (len) { bn = BN_bin2bn(data, len, NULL); } free(data); return bn; } EVP_PKEY* RSA_fromBase64(const char* modulus_b64, const char* exp_b64) { BIGNUM *n = bignum_base64_decode(modulus_b64); BIGNUM *e = bignum_base64_decode(exp_b64); if (!n) printf("Invalid encoding for modulus\n"); if (!e) printf("Invalid encoding for public exponent\n"); if (e && n) { EVP_PKEY* pRsaKey = EVP_PKEY_new(); RSA* rsa = RSA_new(); rsa->e = e; rsa->n = n; EVP_PKEY_assign_RSA(pRsaKey, rsa); return pRsaKey; } else { if (n) BN_free(n); if (e) BN_free(e); return NULL; } } void assert_syntax(int argc, char** argv) { if (argc != 4) { fprintf(stderr, "Description: %s takes a RSA public key modulus and exponent in base64 encoding and produces a public key file in PEM format.\n", argv[0]); fprintf(stderr, "syntax: %s <modulus_base64> <exp_base64> <output_file>\n", argv[0]); exit(1); } }
View Code
生成pem文件之后可以从pem文件里面读取公钥加密相关信息。
最后封装了一下,放在github上:https://github.com/yrs244742688/GeneratePemWithMoAndEx
注解
ASN.1:ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指 代,也不用去管到底是什么样的应用程序。标准的ASN.1编码规则有基本编码规则(BER,Basic Encoding Rules)、规范编码规则(CER,Canonical Encoding Rules)、唯一编码规则(DER,Distinguished Encoding Rules)、压缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。
x.509 : 常见通用的证书格式。
der:DER是ASN.1编码规则的其中一种。x.509证书通过DER编码(ASCII)后缀是:.DER .CER .CRT,通过PAM编码(Base64)的后缀是:.PEM .CER .CRT。.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
pem文件 : der文件经过base64转码后的文件。
@mic
(Email:yrs244742688@gmail.com)
(QQ:839720759)
相关文章推荐
- Java生成RSA非对称型加密的公钥和私钥(利用java API)
- 已知rsa的模数和指数 生成pem公钥文件
- JAVA生成RSA非对称型加密的公钥和私钥(利用JAVA API)
- RSA指数模数加密
- JAVA生成RSA非对称型加密的公钥和私钥(利用JAVA API)
- 利用OpenSSL库对Socket传输进行安全加密(RSA+AES)
- pkcs8 密钥生成 用于RSA非对称加密
- PHP rsa密钥生成 加密解密
- 利用openssl进行RSA加密解密
- (转)DES、RSA、MD5、SHA、随机生成加密与解密
- php 的rsa密匙生成!加密解密
- 利用openSSL 生成RSA公钥和密钥
- php利用openssl实现RSA非对称加密签名
- java RSA 不对称加密密钥生成、加密解密实例
- ios php RSA 非对称加密解密 der 和pem生成
- java RSA 不对称加密密钥生成、加密解密实例
- 利用openssl进行RSA加密解密
- pk12 证书生成 用于RSA非对称加密
- 基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签