openssl如何生成的私钥和公钥 |
您所在的位置:网站首页 › 公钥可以生成私钥吗 › openssl如何生成的私钥和公钥 |
首页证书相关openssl如何生成的私钥和公钥
openssl如何生成的私钥和公钥
发布日期:2017-03-15
通过openssl可以很容易生成一对私钥和公钥,注意私钥和公钥是成对出现的。 私钥:指只有自己知道的一个字符串 公钥:提供出来给大家都知道的一个字符串 关于私钥和公钥的操作分两种:1.公钥加密数据,私钥解密数据 2.私钥签名数据,公钥验证数据 我们一个一个来分析: 1.公钥加密,私钥解密 有很多朋友都想给我发信息,他们发的信息只想给我一个人看,其他人拿到这个信息是看不了的!为了满足这种需求,我们就采用公钥加密,私钥解密这种方式。 朋友们把发给我的信息用大家都知道的公钥进行加密,然后发给我,要想解密该信息就必须要公钥对应的私钥来解密该信息,但是只有我自己知道这个私钥,所以朋友们发过来的信息,就只有我一个人能够解开,也就只有我一个人可以看,因为其他人没有私钥,他们不能解密信息。 图解如下: 2.私钥签名,公钥验证 假设我想给我的一个朋友发送信息,但是可能有其他人冒充我,然后给我朋友发信息,那么我朋友就不敢确定发给他的消息到底是不是我发给他的,为了满足这种需求,就使用私钥签名,公钥验证! 我把我要发送的信息,用只有我自己知道的私钥来进行签名,就相当于在该信息上烙下一个我自己的唯一标记,其他人因为没有这个私钥,所以没有这个标记,信息签名之后,发送给好友,好友知道我这个私钥所对应的公钥,所以对发送他的信息用公钥来验证一下,验证成功,就说明这条信息就是我本人发送给他的。 图解如下: openssl生成公钥私钥对的方法 在Java程序中,可从之前所存储的几个文件中取得密钥与加密结果来做解密。使用了BC的JCE,即bcprov-jdk14-119.jar,在使用之前,需要先安装此JCE:
假设JDK:jdk1.4\jre\ 把BC包放到JRE下的ext:jdk1.4\jre\lib\ext 修改文件jdk1.4\jre\lib\security\java.security: # # List of providers and their preference orders (see above): # security.provider.1=sun.security.provider.Sun security.provider.2=com.trustauth.cn.ssl.internal.ssl.Provider security.provider.3=com.sun.rsajca.Provider security.provider.4=com.sun.crypto.provider.SunJCE security.provider.5=sun.security.jgss.SunProvider
security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider
======================================================================
C++程序源码:
#include #include #include //#define _RSA_KEY_PAIR_GENERATE_//密钥是否要生成 只需要在第一次运行时打开此宏
#define _RSA_KEY_PAIR_TOFILE_//密钥对是否要写入文件
#define MAX_RSA_KEY_LENGTH 512 //密钥的最大长度是512字节
#define PUBKEY_ENCRYPT #define PRIKEY_DECRYPT
#pragma comment(lib, “../lib/libeay32.lib”) static const char * PUBLIC_KEY_FILE = “pubkey.key”; static const char * PRIVATE_KEY_FILE = “prikey.key”;
int RsaKeyPairGen(void) { RSA *rsa = NULL;
#ifdef _RSA_KEY_PAIR_GENERATE_ //生成RSA密钥对: rsa = RSA_new(); rsa = RSA_generate_key(1024, 0x10001, NULL, NULL); #endif
//把密钥对写入文件,以后从文件里读取 #ifdef _RSA_KEY_PAIR_TOFILE_ unsigned char ucPubKey[MAX_RSA_KEY_LENGTH] = {0}, ucPriKey[MAX_RSA_KEY_LENGTH] = {0}; int len = i2d_RSAPublicKey(rsa,NULL); unsigned char* pt = ucPubKey; len = i2d_RSAPublicKey(rsa, &pt);
FILE *fpubkey = NULL; fpubkey = fopen(PUBLIC_KEY_FILE, “wb”); if(fpubkey == NULL) { cout |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |