求个WIN10专业版或者w10家庭版升级专业版的永久激活密匙 谢谢啦

你能不能帮我把我的头周围openssl的公钥加密与rsa.h在c ++?-c++,openssl,rsa,public-key-CodeGo.net
你能不能帮我把我的头周围openssl的公钥加密与rsa.h在c ++?
我试图让我的头周围的公钥RSA在C中的openssl的++。你能帮忙吗?到目前为止,这是我的想法(请不要在必要时更正)
爱丽丝被连接到了鲍勃
Alice和Bob想
Alice生成一个公钥/私钥对,并将公钥给Bob
Bob收到的公共密钥和加密一个随机生成的加密密钥(如blowfish)使用公钥并将结果发送给Alice
爱丽丝解密密文与最初生成的私钥并取得blowfish关键
Alice和Bob现在都有blowfish密钥的知识,可以建立一个通道
现在,我已经看过了的openssl / rsa.h RSA(因为我已经有使用OpenSSL / blowfish.h实践经验),我看这两个函数:
int RSA_public_encrypt(int flen, unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int RSA_private_decrypt(int flen, unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
如果Alice是生成* RSA,请问如何产生RSA密钥对?有没有像rsa_public和rsa_private这是从RSA得出? *是否包含RSA公共密钥和专用密钥和上述函数自动带出 CodeGo.net,取决于它是否需要公共或私有部分必要的关键?应该两个unique的* RSA指针会产生如此,实际上,我们有以下几点:
int RSA_public_encrypt(int flen, unsigned char *from,
unsigned char *to, RSA *rsa_public, int padding);
int RSA_private_decrypt(int flen, unsigned char *from,
unsigned char *to, RSA *rsa_private, int padding);
其次,以什么格式应该* RSA公钥发送给Bob?它必须被重新诠释为一个字符数组,然后发送的标准方法是什么?我听说过的证书-他们是什么关系呢?
对不起,所有的问题,
最良好的祝愿,
编辑:科我目前使用:
* theEncryptor.cpp
* Created by ben on 14/01/2010.
* Copyright 2010 __MyCompanyName__. All rights reserved.
#include "theEncryptor.h"
#include &iostream&
#include &sys/socket.h&
#include &sstream&
theEncryptor::theEncryptor()
theEncryptor::blowfish(unsigned char *data, int data_len, unsigned char* key, int enc)
// hash the key first!
unsigned char obuf[20];
bzero(obuf,20);
SHA1((const unsigned char*)key, 64, obuf);
int keySize = 16;//strlen((char*)key);
BF_set_key(&bfkey, keySize, obuf);
unsigned char ivec[16];
memset(ivec, 0, 16);
unsigned char* out=(unsigned char*) malloc(data_len);
bzero(out,data_len);
int num = 0;
BF_cfb64_encrypt(data, out, data_len, &bfkey, ivec, &num, enc);
//for(int i = 0;i&data_i++)data[i]=out[i];
memcpy(data, out, data_len);
free(out);
theEncryptor::generateRSAKeyPair(int bits)
rsa = RSA_generate_key(bits, 65537, NULL, NULL);
theEncryptor::publicEncrypt(unsigned char* data, unsigned char* dataEncrypted,int dataLen)
return RSA_public_encrypt(dataLen, data, dataEncrypted, rsa, RSA_PKCS1_OAEP_PADDING);
theEncryptor::privateDecrypt(unsigned char* dataEncrypted,
unsigned char* dataDecrypted)
return RSA_private_decrypt(RSA_size(rsa), dataEncrypted,
dataDecrypted, rsa, RSA_PKCS1_OAEP_PADDING);
theEncryptor::receivePublicKeyAndSetRSA(int sock, int bits)
int max_hex_size = (bits / 4) + 1;
char keybufA[max_hex_size];
bzero(keybufA,max_hex_size);
char keybufB[max_hex_size];
bzero(keybufB,max_hex_size);
int n = recv(sock,keybufA,max_hex_size,0);
n = send(sock,"OK",2,0);
n = recv(sock,keybufB,max_hex_size,0);
n = send(sock,"OK",2,0);
rsa = RSA_new();
BN_hex2bn(&rsa-&n, keybufA);
BN_hex2bn(&rsa-&e, keybufB);
theEncryptor::transmitPublicKey(int sock, int bits)
const int max_hex_size = (bits / 4) + 1;
long size = max_hex_
char keyBufferA[size];
char keyBufferB[size];
bzero(keyBufferA,size);
bzero(keyBufferB,size);
sprintf(keyBufferA,"%s\r\n",BN_bn2hex(rsa-&n));
sprintf(keyBufferB,"%s\r\n",BN_bn2hex(rsa-&e));
int n = send(sock,keyBufferA,size,0);
char recBuf[2];
n = recv(sock,recBuf,2,0);
n = send(sock,keyBufferB,size,0);
n = recv(sock,recBuf,2,0);
theEncryptor::generateRandomBlowfishKey(unsigned char* key, int bytes)
srand( (unsigned)time( NULL ) );
for(int i = 0;i&i++){
int randomValue = 65 + rand()% 26;
stm && (char)((int)randomValue);
std::string str(stm.str());
const char* strs = str.c_str();
for(int i = 0;i++)key[i]=strs[i];
int n = RAND_bytes(key, bytes);
if(n==0)std::cout&&"Warning key was generated with bad entropy. You should not consider communication to be secure"&&std::
theEncryptor::~theEncryptor(){}
本文地址 :CodeGo.net/113156/
-------------------------------------------------------------------------------------------------------------------------
1. 其实你应该在更高层次的“信封加密”的函数openssl/evp.h,而不是低层次的RSA函数,直接。这些做最你不必重新发明轮子的工作适合你的。
在这种情况下,你的EVP_SealInit(),EVP_SealUpdate()和EVP_SealFinal()函数。对应的解密函数是EVP_OpenInit(),EVP_OpenUpdate()和EVP_OpenFinal()。我会EVP_aes_128_cbc()作为密码类型的值
一旦你得到了加载到一个公钥RSA *处理,EVP_PKEY_assign_RSA()把它变成一个EVP_PKEY *处理的EVP函数。
一旦你得到了这个去 CodeGo.net,解决了身份认证问题在我,你需要建立一个权威(“遄达”)。 Trent的公钥是已知的(分布式的应用程序或类似-从PEM文件只加载它)。而不是交换包含连同他们自己的RSA公钥和特伦特签名裸露的RSA Alice和Bob交换X509证书。 Alice和Bob然后每个验证它们来自:收到的其他凭证(使用Trent的公钥,他们已经知道了),包括检查,相关的是正确的,持续的协议之前。 OpenSSL的包括在加载和验证证书的职能x509.h头。
这里有一个如何的例子EVP_Seal*()加密给收件者的公开密钥的文件。它采用PEM RSA公钥文件(即由以产生的openssl rsa -pubout)作为线路从标准输入读取源数据和加密数据写入到stdout。要解密,使用EVP_Open*()代替,并PEM_read_RSAPrivateKey()读取私钥,而不是公钥。
这不是真的那么难-当然不容易出错大约产生填补,资讯providers等自己(盖章函数做这笔交易双方的RSA和AES的部分)。总之,代码:
#include &stdio.h&
#include &stdlib.h&
#include &openssl/evp.h&
#include &openssl/pem.h&
#include &openssl/rsa.h&
#include &openssl/err.h&
#include &arpa/inet.h& /* For htonl() */
int do_evp_seal(FILE *rsa_pkey_file, FILE *in_file, FILE *out_file)
int retval = 0;
RSA *rsa_pkey = NULL;
EVP_PKEY *pkey = EVP_PKEY_new();
EVP_CIPHER_CTX
unsigned char buffer[4096];
unsigned char buffer_out[4096 + EVP_MAX_IV_LENGTH];
unsigned char *
uint32_t eklen_n;
unsigned char iv[EVP_MAX_IV_LENGTH];
if (!PEM_read_RSA_PUBKEY(rsa_pkey_file, &rsa_pkey, NULL, NULL))
fprintf(stderr, "Error loading RSA Public Key File.\n");
ERR_print_errors_fp(stderr);
retval = 2;
if (!EVP_PKEY_assign_RSA(pkey, rsa_pkey))
fprintf(stderr, "EVP_PKEY_assign_RSA: failed.\n");
retval = 3;
EVP_CIPHER_CTX_init(&ctx);
ek = malloc(EVP_PKEY_size(pkey));
if (!EVP_SealInit(&ctx, EVP_aes_128_cbc(), &ek, &eklen, iv, &pkey, 1))
fprintf(stderr, "EVP_SealInit: failed.\n");
retval = 3;
/* First we write out the encrypted key length, then the encrypted key,
* then the iv (the IV length is fixed by the cipher we have chosen).
eklen_n = htonl(eklen);
if (fwrite(&eklen_n, sizeof eklen_n, 1, out_file) != 1)
perror("output file");
retval = 5;
if (fwrite(ek, eklen, 1, out_file) != 1)
perror("output file");
retval = 5;
if (fwrite(iv, EVP_CIPHER_iv_length(EVP_aes_128_cbc()), 1, out_file) != 1)
perror("output file");
retval = 5;
/* Now we process the input file and write the encrypted data to the
* output file. */
while ((len = fread(buffer, 1, sizeof buffer, in_file)) & 0)
if (!EVP_SealUpdate(&ctx, buffer_out, &len_out, buffer, len))
fprintf(stderr, "EVP_SealUpdate: failed.\n");
retval = 3;
if (fwrite(buffer_out, len_out, 1, out_file) != 1)
perror("output file");
retval = 5;
if (ferror(in_file))
perror("input file");
retval = 4;
if (!EVP_SealFinal(&ctx, buffer_out, &len_out))
fprintf(stderr, "EVP_SealFinal: failed.\n");
retval = 3;
if (fwrite(buffer_out, len_out, 1, out_file) != 1)
perror("output file");
retval = 5;
EVP_PKEY_free(pkey);
int main(int argc, char *argv[])
FILE *rsa_pkey_
if (argc & 2)
fprintf(stderr, "Usage: %s &PEM RSA Public Key File&\n", argv[0]);
rsa_pkey_file = fopen(argv[1], "rb");
if (!rsa_pkey_file)
perror(argv[1]);
fprintf(stderr, "Error loading PEM RSA Public Key File.\n");
rv = do_evp_seal(rsa_pkey_file, stdin, stdout);
fclose(rsa_pkey_file);
你已经很好地贴为什么你更高级别的函数的代码-你已经陷入了几个陷阱:rand()是underline不加密的强随机数发生器!生成您rand()足以让整个不安全。 (该EVP_*()函数生成所需的随机数字本身,使用强加密RNG,从适当的熵源去籽)。
你是四对CFB模式设定为一个固定值(零)。这否定了任何优势CFB模式摆在首位(允许攻击者执行平凡块的攻击,更糟糕)。 (该EVP_*()函数为你生成一个合适的静脉,必要时)。RSA_PKCS1_OAEP_PADDING应该如果你定义一个新的协议,而不是与现有的协议进行互操作。
相应的解密代码,为后人:
#include &stdio.h&
#include &stdlib.h&
#include &openssl/evp.h&
#include &openssl/pem.h&
#include &openssl/rsa.h&
#include &openssl/err.h&
#include &arpa/inet.h& /* For htonl() */
int do_evp_unseal(FILE *rsa_pkey_file, FILE *in_file, FILE *out_file)
int retval = 0;
RSA *rsa_pkey = NULL;
EVP_PKEY *pkey = EVP_PKEY_new();
EVP_CIPHER_CTX
unsigned char buffer[4096];
unsigned char buffer_out[4096 + EVP_MAX_IV_LENGTH];
unsigned char *
uint32_t eklen_n;
unsigned char iv[EVP_MAX_IV_LENGTH];
if (!PEM_read_RSAPrivateKey(rsa_pkey_file, &rsa_pkey, NULL, NULL))
fprintf(stderr, "Error loading RSA Private Key File.\n");
ERR_print_errors_fp(stderr);
retval = 2;
if (!EVP_PKEY_assign_RSA(pkey, rsa_pkey))
fprintf(stderr, "EVP_PKEY_assign_RSA: failed.\n");
retval = 3;
EVP_CIPHER_CTX_init(&ctx);
ek = malloc(EVP_PKEY_size(pkey));
/* First need to fetch the encrypted key length, encrypted key and IV */
if (fread(&eklen_n, sizeof eklen_n, 1, in_file) != 1)
perror("input file");
retval = 4;
eklen = ntohl(eklen_n);
if (eklen & EVP_PKEY_size(pkey))
fprintf(stderr, "Bad encrypted key length (%u & %d)\n", eklen,
EVP_PKEY_size(pkey));
retval = 4;
if (fread(ek, eklen, 1, in_file) != 1)
perror("input file");
retval = 4;
if (fread(iv, EVP_CIPHER_iv_length(EVP_aes_128_cbc()), 1, in_file) != 1)
perror("input file");
retval = 4;
if (!EVP_OpenInit(&ctx, EVP_aes_128_cbc(), ek, eklen, iv, pkey))
fprintf(stderr, "EVP_OpenInit: failed.\n");
retval = 3;
while ((len = fread(buffer, 1, sizeof buffer, in_file)) & 0)
if (!EVP_OpenUpdate(&ctx, buffer_out, &len_out, buffer, len))
fprintf(stderr, "EVP_OpenUpdate: failed.\n");
retval = 3;
if (fwrite(buffer_out, len_out, 1, out_file) != 1)
perror("output file");
retval = 5;
if (ferror(in_file))
perror("input file");
retval = 4;
if (!EVP_OpenFinal(&ctx, buffer_out, &len_out))
fprintf(stderr, "EVP_OpenFinal: failed.\n");
retval = 3;
if (fwrite(buffer_out, len_out, 1, out_file) != 1)
perror("output file");
retval = 5;
EVP_PKEY_free(pkey);
int main(int argc, char *argv[])
FILE *rsa_pkey_
if (argc & 2)
fprintf(stderr, "Usage: %s &PEM RSA Private Key File&\n", argv[0]);
rsa_pkey_file = fopen(argv[1], "rb");
if (!rsa_pkey_file)
perror(argv[1]);
fprintf(stderr, "Error loading PEM RSA Private Key File.\n");
rv = do_evp_unseal(rsa_pkey_file, stdin, stdout);
fclose(rsa_pkey_file);
感谢@咖啡馆!
我有试图加载一个公开密钥的函数PEM_read_RSAPublicKey(与OpenSSL的RSA-pubout生成的)问题。我一直得到以下错误:
23260:错误:0906D06C:PEM例程:PEM_read_bio:无起跑线:/ SourceCache/OpenSSL098/OpenSSL098-32/src/crypto/pem/pem_lib.c:650:期待:RSA公钥
但看你的例子要调用的函数是PEM_read_RSA_PUBKEY,现在它的作品!
现在,如果我只能想出如何加载一个加密的私钥没有得到以下错误:
23328:错误::PEM例程:PEM_get_EVP_CIPHER_INFO:不支持的加密:/ SourceCache/OpenSSL098/OpenSSL098-32/src/crypto/pem/pem_lib.c:484:
曾试图加密
编辑:只是需要调用OpenSSL_add_all_algorithms()中找到
其实,没问题,我刚才宣读,基本上,RSA的对象是一个包含公共和private领域的结构。人们可以提取公共领域的数据和只发送给Bob。
即基本上,从RSA提取公共字段和每个在两个不同的缓冲区(这是字符数组,然后可以发送给Bob)存储,你要做的:
sprintf(keyBufferA,"%s\r\n",BN_bn2hex(rsa-&n));
sprintf(keyBufferB,"%s\r\n",BN_bn2hex(rsa-&e));
然后鲍勃,在接收端,重建如下:
rsa = RSA_new();
BN_hex2bn(&rsa-&n, keybufA);
BN_hex2bn(&rsa-&e, keybufB);
Bob可以RSA *公开加密,然后将其发送给Alice的加密密钥。然后Alice可以解密用私钥
我写身边非洲足联的代码的两个例子。他们大量体改OpenSSL的BIO容器更抽象。
一个文件作为输入,而另一个字符串缓冲区中。RSA和DES,但是你可以很容易地从代码更改。编译指令里面的代码。我需要一个工作的例子,我希望找到我的代码。你可以从这里得到它:
就拿文件作为输入:
取字符串缓冲区作为输入:
感谢@咖啡馆。您的文章有帮助。但是我得到了
该程序的[7056] Encryption2.exe:原生“已退出,该行代码-(0xc000000d)
PEM_read_RSA_PUBKEY(rsa_pkey_file, &rsa_pkey, NULL, NULL)
bio = BIO_new(BIO_s_mem());
BIO_puts(bio, (const char*)data);
certificate = PEM_read_bio_X509(bio, NULL, NULL, NULL);
EVP_PKEY *pubkey = X509_get_pubkey (certificate);
rsa_pkey = EVP_PKEY_get1_RSA(pubkey);
在数据仅与公钥PEM文件。我的挑战是在C ++来加密和解密在java中。我发送的base64编码的大小EK eklen(我做eklen_n)和解密得到的AES的RSA私钥。然后,我解密的密码本AES密钥。它工作得很好。
本文标题 :你能不能帮我把我的头周围openssl的公钥加密与rsa.h在c ++?
本文地址 :CodeGo.net/113156/
Copyright (C) 2017 CodeGo.net非常感谢CSDN各位大大一直以来的指点。。。
我现在的一个项目需要用C++写的COM组件加密一串字符串,保存密钥到MYSQL数据库,然后用PHP解密出原文
现在的关键的问题就是密钥的问题。。。C++下得到并保存的密钥不能在PHP中使用
在C++中,密钥是这样生成出来的
m_pRsa&=&RSA_new();&
m_pRsa&=&RSA_generate_key(m_rsa_bits,RSA_F4,NULL,NULL);&/
len&=&i2d_RSAPublicKey(m_pRsa,&&Pt);&//得到公钥,然后我会把公钥保存到MYSQL数据库中,私钥也是这么保存的。。
len&=&i2d_RSAPrivateKey(m_pRsa,&&Pt);
现在在PHP中。。
我从MYSQL数据库中读出密钥到$realPubKey。。
然后调用这样调用
openssl_public_encrypt($message,$encoded,$realPubKey);
但是这样是错误的。
Warning:&openssl_public_encrypt():&key&parameter&is&not&a&valid&public&key&in&c:\program&files\easyphp1-8\www\4.php&on&line&46
这也许是我对密钥的理解不对造成的。。。。我不知道openssl_public_encrypt这个函数所需要的密钥应该是怎样的格式。。看了一些示例代码,但那些都是从一个格式为crt的文件里读取的密钥信息,这和我目前这个项目有不一样的地方。。
在PHP中使用OPENSSL,好像没有和以下C++语句等效的代码。。PHP的OPENSSL扩展中,似乎都没有struct&RSA这个结构体来保存密钥信息。。
m_pRsa&=&RSA_new();&
m_pRsa&=&d2i_RSAPublicKey(NULL,&&Pt,&KeyDataLen);&//设置公钥
m_pRsa&=&d2i_RSAPrivateKey(NULL,&&Pt,&KeyDataLen);设置私钥
我应该怎样保存密钥才能使得C++程序和PHP程序可以互相加解密呢。。。
回复讨论(解决方案)
手册里面有人给写的评论,不知道对你有用没有:
The&public&key&must&be&on&one&line&starting&with&the&key&type,&1&space&and&followed&by&the&keydata&(no&newlines)&and&not&followed&by&comments.&This&is&a&limitation&of&libssh2,&so&remove&any&excess&data&from&the&file&after&creating&it&with&your&key&generation&tools.
So&it&would&look&something&like&this:
ssh-rsa&&keydata&&
The&public&key&must&be&on&one&line&starting&with&the&key&type,&1&space&and&followed&by&the&keydata&(no&newlines)&and&not&followed&by&comments.&This&is&a&limitation&of&libssh2,&so&remove&any&excess&data&from&the&file&after&creating&it&with&your&key&generation&tools.
So&it&would&look&something&like&this:
ssh-rsa&&keydata&&
重了。。。。
第二个人这么说的:
For&example&the&pubkey&file&should&look&like&this:
ssh-rsa&AAAAB3NzaC1yc2EAAAABJQAAAIEAo6uBphcbl
5iS7U0fjE1ZJ8ZPqYwezFbxyN13YYucrFDCbln9Q6S33lN
JMYKUY4711qzDOxQD0bratDQfHUl4waT35qI+NRQa2
B+UWHYaOhbt5FI0Ks7JXPxj3iJ/+joiKQW3Bj8eH8Nzg
sTx4tEVPD6QOHs682OhUNX6sqSnHA8=&rsa-key-&
多些bookmoth兄给的参考。。。。
我也觉得是我对密钥的格式不理解造成的。。。。
在C++中,我使用了这两个函数来使密钥被保存和设置
d2i_RSAPublicKey()&and&i2d_RSAPublicKey()&decode&and&encode&a&PKCS#1&RSAPublicKey&structure.
但PHP的OPENSSL中,似乎没有相对应的函数可供使用。。
我对OPENSSL乃至加密签名并不了解,正在费力地搜索+阅读中。。请有经验的大哥指条明路。。。
你把C++生成的密钥写到文件里,看看格式是什么样子的。
是这样。。。我用C++生成了密钥后,密钥保存在struct&RSA这个结构体里,
然后我调用了len&=&i2d_RSAPublicKey(m_pRsa,&&Pt);
pt里面就是公钥数据了。。至于格式好象没有什么特别的,就是一串二进制编码。。
那你按照ssh-rsa&&keydata&&
这样的格式,弄成个文件,去php里试试啊。
看那个keydata好像是base64类似物编码过的二进制。
楼主写个php扩展用来解密&^_^&
那你按照ssh-rsa&&keydata&&
这样的格式,弄成个文件,去php里试试啊。&
看那个keydata好像是base64类似物编码过的二进制。
多谢大哥耐心的指点。。
好像在前面加个头后还要经过一系列处理。。。我的问题正是我不太清楚如何去处理。。。
我搜了个文章,是C++和JAVA使用OPENSSL加解密的代码示例。。
http://blog.csdn.net/boise/archive//411347.aspx
其中有这样一个函数我觉得对我很关键
&&&*&从公钥数据取得公钥
&&&*&@param&bPubKeyInput
&&&*&@return
&&PublicKey&getRsaPubKey(byte[]&bPubKeyInput)&{
&&&&byte[]&bX509PubKeyHeader&=&{
&&&&&&&&48,&-127,&-97,&48,&13,&6,&9,&42,&-122,&72,&-122,&-9,&13,&1,&1,&1,&5,&0,
&&&&&&&&3,&-127,&-115,&0};
&&&&&&byte[]&bPubKey&=&new&byte[bPubKeyInput.length&+&bX509PubKeyHeader.length];
&&&&&&System.arraycopy(bX509PubKeyHeader,&0,&bPubKey,&0,
&&&&&&&&&&&&&&&&&&&&&&&bX509PubKeyHeader.length);
&&&&&&System.arraycopy(bPubKeyInput,&0,&bPubKey,&bX509PubKeyHeader.length,
&&&&&&&&&&&&&&&&&&&&&&&bPubKeyInput.length);
&&&&&&X509EncodedKeySpec&rsaKeySpec&=&new&X509EncodedKeySpec(bPubKey);
&&&&&&KeyFactory&keyFactory&=&KeyFactory.getInstance(&RSA&);
&&&&&&rsaPubKey&=&keyFactory.generatePublic(rsaKeySpec);
&&&&catch&(Exception&e)&{
&&&&&&e.printStackTrace();
&&&&return&rsaPubK
似乎是在公钥信息前加上一段固定的&头&。。。。然后经过一些处理,就可以得到&真正的&公钥了。。但是这个代码是JAVA代码。
我想如果有个PHP版本的这个函数就好了。。。而JAVA&和&PHP我都不懂。。X.509这个标准(格式?)我也是刚知道-_-!。。真令人沮丧啊。。。
如何将C++中使用i2d_RSAPublicKey(m_pRsa,&&Pt);保存下来的密钥信息恢复成&真正的&密钥。。。。。
楼主写个php扩展用来解密&^_^&
大哥。。。我搜索了一下资料,我想勉强可以写WIN下的PHP扩展,但是LINUX的的扩展我可就懵了。。。
这个东西得用在LINUX服务器上的,所以最好能直接用PHP解决。。
PEAR有类库,lz看看这里,很多东西不需要自己写。
PEAR有类库,lz看看这里,很多东西不需要自己写。&
http://pear.php.net/reference/Crypt_RSA-1.0.0/Crypt_RSA/_Crypt_RSA-1.0.0_RSA_php.html
PHP有支持OPENSSL扩展,所以我想就用OPENSSL库的RSA算法就好了。。现在的问题就是密钥格式的问题了。
在用C++保存密钥的时候
我用到了这个函数i2d_RSAPrivateKey,这应该是将密钥保存成DER编码(?,我对OPENSSL知之甚少,现在只能根据现搜现学的知识来推断了)
而PHP中要使用这个密钥,应该得用相应的d2i_RSAPrivateKey&函数来处理密钥,问题是我在PHP的manual里没看到相关的内容。。。
根据CSDN上各位达人的提示,我觉得应该是要将密钥从DER二进制编码转到BASE64编码,然后才能在PHP下使用密钥。。。
我的理解有没有错?
有能在这方面(将密钥从DER二进制编码转到BASE64编码)提供帮助的朋友么?&
你不如贴上你生成的&private&key,public&key,明文,密文上来吧
现在根本不知道你生成了什么
你不如贴上你生成的&private&key,public&key,明文,密文上来吧&
现在根本不知道你生成了什么&
好的,是这样,我贴一下PHP代码
$prikey&=&mysql_result($result,0,'prikey');&//从数据库得到保存的prikey,这个prikey我在C++组件那里保存之前做了一个bin2ascii的转换。
//这样得到的输出是:c6ef3b5fa734d6ed4bb976bb22aeabce2c259ff62ffa0b31fd34e07dcbb8c56bfaa847ba13dbb10efaef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7cbce1d557b8be4ef3eeccccb9adfcc8d6e797d94ab772a1c302e813c835ea1f5f2a11c8d0fa9ac4bbd9a94b0b815b3cfbc7f2a28056faa02bf560accae6d9eb62cc1def66af15e60b7e3193fac33c4346bd8dfd1f14b804fdb53b9cf59d0fb2f35e9fac33cceef158a5ede971d01f3b4d8ffcea1e0adb5e110eb3a95fc5fed5f6edb8f6ddaf51bca8a54b3c7ed110fd9448ccc40fe3f4f1fae8a627ec578b3b1fad891fcd83d1fda17d85cb23bc21afb2d83fc00f5e1c3452ea67ebebf6c2fd5e74dfbf8f3af926af71ea486ef373f61a9fc41f27d0fcc760ff046dd1d832ad8a8a63fecd1c5d5fadeca9152dd3ccd6052655efd12c218ae41822cfcc1d5dae7a2a5d8246eaca24bfb1dff30fc7bfef1e28d4a702400bdc61fa4f449bee6f6e4fad53eb0f26e78cb97ccc55f1fedc8cfa902b9e9acbbf9b
//所以我要转换回来,下面我做一个ASCII2BIN的转换
$realPriKey&=&&pack(&H*&,$prikey);
echo&$realPriK
//得到的输出是:
0?‰??&AE&;Y?&&Abo&4&O&K¹v&&&&&I18?,%?2I&?G&/&&1&4&}&EX%!&O&&Akb&'(&?{&=&&e?7&Q&&?0y&&e&I:!?&&O&|0&d&OA&A?=&|y8&A2?&I&?&……U{?4!&&&&&&&I&E?&
//可以看到,二进制的密钥数据很多都是不可显示字符比如0x03&0x0b这样的字符。。。&
这个密钥数据又是如何得到的呢?
是我在C++中用OPENSSL的库函数i2d_RSAPrivateKey(m_pRsa,&&Pt);//私钥保存在*pt&这样得到的,
现在来看得到的应该是DER编码的密钥。
在PHP中,我要使用这个密钥
bool&openssl_private_decrypt&(&string&$data&,&string&&$decrypted&,&mixed&$key&[,&int&$padding=OPENSSL_PKCS1_PADDING&]&)
$key&这个参数要求的应该是PEM(也就是BASE64)格式编码的密钥
所以,我需要将密钥格式进行一个转换。。。
我不知道我是否描述清楚了?
我把密钥保存在文件里。。用WINHEX打开是这样的形式。。。我这这个DER编码的密钥,如何将其转成BASE64编码格式的?
&&&30&82&02&5D&02&01&00&02&&81&81&00&EA&3F&AE&89&C9&&&0?]....?.???
&&&9E&47&3C&2C&E7&E3&84&A1&&2D&4D&C0&25&EE&70&4A&70&&&?&,玢?-M??Jp
&&&43&A5&76&D1&8D&60&59&A3&&E0&3A&D4&C7&79&82&18&06&&&C??`Y`:郧y?.
&&&F7&D5&A4&8F&32&F8&F9&F0&&F9&58&1A&2E&2B&FE&BC&57&&&髡?2?瘗X..+?W
&&&35&67&6C&56&51&35&9A&D4&&58&0B&A2&C9&C7&71&27&1E&&&5glVQ5?X.⑸?'.
&&&71&F7&A9&9F&5D&AB&08&41&&0D&C3&F2&52&FE&60&F2&4A&&&q鳗??A.抿R??
&&&C3&A7&11&68&32&0A&A1&05&&30&0F&60&86&79&3D&40&08&&&莽.h2.?0.`?=@.
&&&9A&09&94&FA&3D&EF&40&7F&&7E&24&72&D4&3D&C0&D6&81&&&??=?~$r?乐?
&&&D1&97&2D&18&53&5D&47&FC&&DD&A0&25&02&01&03&02&81&&&?-.S]G??....?
&&&81&00&9C&2A&74&5B&DB&BE&&DA&28&1D&EF&ED&03&16&1E&&&??t[劬?.镯...
&&&33&D5&6E&9E&F5&86&F5&82&&6E&4F&36&5E&40&3B&C2&95&&&3????O6^@;?
&&&7C&8D&DA&51&01&65&59&FA&&8E&6D&B4&CC&A5&FB&F5&FB&&&|?Q.eY?m刺?觖
&&&90&11&74&1D&54&7D&8F&78&&EF&9D&8E&E0&CE&67&38&3A&&&?t.T}????8:
&&&B2&6B&40&01&2B&00&D1&9B&&5F&17&84&7A&60&BE&6F&71&&&?@.+.?_.?`?q
&&&AA&54&72&96&A9&63&2A&58&&6E&80&C7&2D&29&D7&5E&8C&&&?r?c*Xn??)??
&&&99&DC&4A&9C&B6&B2&69&F9&&F2&1D&1E&5F&CD&FC&A5&09&&&?J???.._忘?
&&&A3&D5&4D&9C&FE&EA&77&98&&4E&B2&8B&F4&04&D2&65&C0&&&UM???????
&&&C1&33&02&41&00&F6&1F&28&&E2&FE&AD&62&5F&93&D0&0D&&&?.A.?(恂?_?.
&&&C2&0E&09&8C&F4&88&5B&ED&&CE&97&B8&FB&68&6F&05&D4&&&?.??砦??o.?
&&&2E&EB&42&54&53&6F&FB&37&&AE&76&4F&41&AD&64&12&0C&&&.?TSo??OA?..
&&&39&BB&C7&DF&0F&29&12&5C&&23&2E&5C&C0&07&9D&DA&FE&&&9磺?).\#.\???
&&&EF&C1&97&F5&FB&02&41&00&&F3&A6&87&C2&E5&5B&86&A6&&&锪??A.螃???
&&&C4&D6&0C&28&8B&D9&B7&7F&&1E&C0&75&0E&F3&86&05&E7&&&闹.(??.?.?.?
&&&CE&68&77&AF&0C&1A&D4&42&&A6&92&F3&85&F3&53&DC&BB&&&?w?.????芑
&&&E8&9C&2E&0B&CC&27&CF&A3&&B6&BF&E6&53&A0&10&61&19&&&?..?希犊??a.
&&&A8&8A&57&1C&A2&A4&88&5F&&02&41&00&A4&14&C5&EC&A9&&&?W.??.A.?澎?
&&&C8&EC&3F&B7&E0&09&2C&09&&5B&B3&4D&B0&3D&49&34&65&&&褥?粪.,.[??I4e
&&&25&FC&F0&4A&03&E2&C9&F2&&2C&38&37&9F&FC&CF&C9&A4&&&%?J.馍?87?仙?
&&&34&D6&73&98&0C&08&26&7D&&2F&EA&0A&1B&61&92&C2&1E&&&4??.&}/?.a?.
&&&E8&80&05&13&E7&54&9F&D6&&65&4E&A7&02&41&00&A2&6F&&&?..??eN?A.?
&&&05&2C&98&E7&AF&19&D8&8E&&B2&C5&B2&91&24&FF&69&D5&&&.,???才?$?i?
&&&A3&5F&4D&04&03&EF&DE&F0&&4F&CA&08&11&E2&D7&19&B7&&&?M..镛??.庾.?
&&&4D&03&F7&8D&3D&D2&9B&12&&C9&5D&32&C5&35&17&CF&2A&&&M.?=?.?2?.?
&&&99&8D&15&60&40&BB&C5&B1&&8F&68&6C&6D&B0&3F&02&41&&&?.`@慌?hlm?.A
&&&00&C7&48&18&B6&27&E1&9E&&6D&B3&C2&E7&0A&3E&C0&A0&&&.?.??m陈?&?
&&&24&A7&2C&EB&AE&28&46&03&&94&1E&7E&2B&74&FE&87&EB&&&$?氘(F.?~+t??
&&&A0&74&D0&E2&6E&D7&6D&A0&&AE&5C&84&A9&3E&89&0A&D2&&&?锈n??\?&??
&&&1D&4F&7F&83&4D&91&FC&F5&&22&9A&D3&87&34&65&27&58&&&.O?????e'X
&&&51&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Q
$der_data&=&&c6ef3b5fa734d6ed4bb976bb22aeabce2c259ff62ffa0b31fd34e07dcbb8c56bfaa847ba13dbb10efaef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7cbce1d557b8be4ef3eeccccb9adfcc8d6e797d94ab772a1c302e813c835ea1f5f2a11c8d0fa9ac4bbd9a94b0b815b3cfbc7f2a28056faa02bf560accae6d9eb62cc1def66af15e60b7e3193fac33c4346bd8dfd1f14b804fdb53b9cf59d0fb2f35e9fac33cceef158a5ede971d01f3b4d8ffcea1e0adb5e110eb3a95fc5fed5f6edb8f6ddaf51bca8a54b3c7ed110fd9448ccc40fe3f4f1fae8a627ec578b3b1fad891fcd83d1fda17d85cb23bc21afb2d83fc00f5e1c3452ea67ebebf6c2fd5e74dfbf8f3af926af71ea486ef373f61a9fc41f27d0fcc760ff046dd1d832ad8a8a63fecd1c5d5fadeca9152dd3ccd6052655efd12c218ae41822cfcc1d5dae7a2a5d8246eaca24bfb1dff30fc7bfef1e28d4a702400bdc61fa4f449bee6f6e4fad53eb0f26e78cb97ccc55f1fedc8cfa902b9e9acbbf9b&;
$der_data&=&&pack(&H*&,$der_data);&
$pem&=&chunk_split(base64_encode($der_data),&64,&&\n&);
$pem&=&&-----BEGIN&RSA&PRIVATE&KEY-----\n&.$pem.&-----END&RSA&PRIVATE&KEY-----\n&;
echo&&DER&to&PEM&;
echo&&&h1&Key&/h1&&pre&$pem&/pre&&;
PHP&code$der_data&=&&c6ef3b5fa734d6ed4bb976bb22aeabce2c259ff62ffa0b31fd34e07dcbb8c56bfaa847ba13dbb10efaef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7cbce1d557b8be4ef3eeccccb9adfcc8d6e797d94ab772a1c302e813c835ea1f5f2a11c8d0fa9a8977b…
感谢大哥~~~太感谢了。。。
但是写程序经常就是这样的情况。。。解决一个问题,新的问题就接踵而至。。
我试图用得到的PEM格式的公钥进行加密
$DerPubKey&=&&pack(&H*&,$Pubkey);
$pemPubKey&=&base64_encode($DerPubKey);&//$pemPriKey&=&chunk_split(base64_encode($DerPriKey),&64,&&\n&);&
$RealPubKey&=&&openssl_pkey_get_public($pemPubKey);
$message=&ABCD&;
openssl_public_encrypt($message,$encoded,$RealPubKey);
仍然会得到这样的提示
Warning:&openssl_public_encrypt():&key&parameter&is&not&a&valid&public&key&in
似乎仍然提示我给的公钥是无效的。。。
我正在认真研读manual以找出我是不是在哪理解有错。。。
以您对PHP的熟悉,您能给我一些建议么?万分万分感谢。。
Private&Key
-----BEGIN&RSA&PRIVATE&KEY-----
MIICXgIBAAKBgQDNS084xZA0cbdjsZxO7nWalECTrho2vzt4KjE2dVCmDLOLAEHs
7nCrJQmZ9Zu4WJe1HdC4TeHaXu0uc7aHdnX8mWHA9wBasPQXSzK5g6MqRrrDLj0x
skJhN0oPalyMCfPfDj95aycdw5jMjEz/e7K29tR44I8d+bt9uNc+iEj4DwIDAQAB
AoGBAMF4EYbNGONzr4JyZX41V/t/b4Q9dVLW0XKjQJGz6XczTRjX+0kQRHnlg7Dm
OAR46S+0k3i9XPVwtFEsl339852SAnkVAgo/2+cRLG/XZqAoSCMOOrta/LZVxS94
Wu5iyVt6WPxDcCrKAkpQAQEqRFgq0PspS5rSrDtkVMWG5Q6xAkEA+yI4VG8m1GHt
HGsC8Aqb64yzgSbJRXl72Ifr2wxsmJi0A5oZin1VGDLqWWvznisAUpB9jB8ANf+u
0+bB6L3KXQJBANFFsmbRPJucW4UJ2H/bE3JQ1w3/R+WG1BExHmfI/p2zJcl6LoJy
Ze+tZAzhjjO0njLBcwSgxwSfW2WyfuEjnVsCQQDNYlkrRJQ/Ea93lFUct7B43eNY
dr4Y4ZfVqKPNy8Vsr0ZZw8erqYDUf5+FbnIZIxXqcF0dIaVshCUZDBn+HGnJAkEA
wFa4kzs34yWgD/RuoYRuqSCXp2u7Xr++5VYpxeW77qEa18SOPqJ6AgFw9U3RbsBQ
rgGSfuxuPldgn2Wgq7gaBQJAXrHAnLP7MVCRfYMABxdOncg+C+PO0nkwos09eAic
Y9zqqB1JvxVxdx3E5LquULtf4l6POwrTt8P+Oy6dGvDHqw==
-----END&RSA&PRIVATE&KEY-----
Public&Key
-----BEGIN&PUBLIC&KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNS084xZA0cbdjsZxO7nWalECT
rho2vzt4KjE2dVCmDLOLAEHs7nCrJQmZ9Zu4WJe1HdC4TeHaXu0uc7aHdnX8mWHA
9wBasPQXSzK5g6MqRrrDLj0xskJhN0oPalyMCfPfDj95aycdw5jMjEz/e7K29tR4
4I8d+bt9uNc+iEj4DwIDAQAB
-----END&PUBLIC&KEY-----
-----BEGIN&PUBLIC&KEY-----&
-----END&PUBLIC&KEY-----
$plaintext&=&&Hello&;
$pubkey&=&openssl_pkey_get_public(file_get_contents(&pub.key&));
$privkey&=&openssl_pkey_get_private(file_get_contents(&pri.key&));
//encrypt&&&decrypt
openssl_public_encrypt($plaintext,$crypted,$pubkey);
openssl_private_decrypt($crypted,$decrypted,$privkey);
echo&&&h1&Plaintext&/h1&&pre&$plaintext&/pre&&;
echo&&&h1&Crypted&/h1&&pre&$crypted&/pre&&;
echo&&&h1&Crypted(base64)&/h1&&pre&&.chunk_split(base64_encode($crypted),&64,&&\n&).&&/pre&&;
echo&&&h1&Decrypted&/h1&&pre&$decrypted&/pre&&;
跑到&Framework&分类了&o_o||
跟Framework有什么关系?
我看了下manual
resource&openssl_pkey_get_public&(&mixed&$certificate&)
Parameters
certificate&
certificate&can&be&one&of&the&following:&
1.an&X.509&certificate&resource&
2.a&string&having&the&format&file://path/to/file.pem.&The&named&file&must&contain&a&PEM&encoded&certificate/private&key&(it&may&contain&both).&
3.A&PEM&formatted&private&key.&&//一个PEM格式的私钥,应该就是我得到的$pemPriKey吧?我$pemPubKey也试了。。已经病急乱投医了-_-!
$DerPubKey&=&&pack(&H*&,$Pubkey);
$pemPubKey&=&base64_encode($DerPubKey);&//$pemPriKey&=&chunk_split(base64_encode($DerPriKey),&64,&&\n&);&
$RealPubKey&=&&openssl_pkey_get_public($pemPriKey);&//这里我给同上面得到的$pemPriKey,但是结果是一样的。。
$message=&ABCD&;
openssl_public_encrypt($message,$encoded,$RealPubKey);
仍然提示:&openssl_public_encrypt():&key&parameter&is&not&a&valid&public&key&
-----BEGIN&PUBLIC&KEY-----&
-----END&PUBLIC&KEY-----&
好,我马上试试。。。
您是在哪看到这个贴的?为了解决这个问题我转了好几次版块。。转到过C++,您是在那看到的么?
Private&Key&
-----BEGIN&RSA&PRIVATE&KEY-----&
MIICXgIBAAKBgQDNS084xZA0cbdjsZxO7nWalECTrho2vzt4KjE2dVCmDLOLAEHs&
7nCrJQmZ9Zu4WJe1HdC4TeHaXu0uc7aHdnX8mWHA9wBasPQXSzK5g6MqRrrDLj0x&
skJhN0oPalyMCfPfDj95aycdw5jMjEz/e7K29tR44I8d+bt9uNc+iEj4DwIDAQAB&
AoGBAMF4EYbNGONzr4JyZX41V/t/b4Q9dVLW0XKjQJGz6XczTRjX+0kQRHnlg7Dm&
OAR46S+0k3i9XPVwtFEsl339852SAnkVAgo/2+cRLG/XZqAoSCMOOrta/LZVxS94&
Wu5iyVt6WPxDc…
大哥,你是怎么知道公钥的?好像我的帖子里没给出公钥。。。。难道是可以算出来?
如果您真的可以算出公钥说明这个密钥格式是没错的了?但是现在问题出在哪呢?
我用了你上面的这段代码。。貌似还是提示
openssl_public_encrypt():&key&parameter&is&not&a&valid&public&key&
我把pri.key和pub.key&按下面的方式会保存。。有换行或者没换行我都试过了。。
Private&Key&
-----BEGIN&RSA&PRIVATE&KEY-----&
MIICXgIBAAKBgQDNS084xZA0cbdjsZxO7nWalECTrho2vzt4KjE2dVCmDLOLAEHs&
7nCrJQmZ9Zu4WJe1HdC4TeHaXu0uc7aHdnX8mWHA9wBasPQXSzK5g6MqRrrDLj0x&
skJhN0oPalyMCfPfDj95aycdw5jMjEz/e7K29tR44I8d+bt9uNc+iEj4DwIDAQAB&
AoGBAMF4EYbNGONzr4JyZX41V/t/b4Q9dVLW0XKjQJGz6XczTRjX+0kQRHnlg7Dm&
OAR46S+0k3i9XPVwtFEsl339852SAnkVAgo/2+cRLG/XZqAoSCMOOrta/LZVxS94&
Wu5iyVt6WPxDcCrKAkpQAQEqRFgq0PspS5rSrDtkVMWG5Q6xAkEA+yI4VG8m1GHt&
HGsC8Aqb64yzgSbJRXl72Ifr2wxsmJi0A5oZin1VGDLqWWvznisAUpB9jB8ANf+u&
0+bB6L3KXQJBANFFsmbRPJucW4UJ2H/bE3JQ1w3/R+WG1BExHmfI/p2zJcl6LoJy&
Ze+tZAzhjjO0njLBcwSgxwSfW2WyfuEjnVsCQQDNYlkrRJQ/Ea93lFUct7B43eNY&
dr4Y4ZfVqKPNy8Vsr0ZZw8erqYDUf5+FbnIZIxXqcF0dIaVshCUZDBn+HGnJAkEA&
wFa4kzs34yWgD/RuoYRuqSCXp2u7Xr++5VYpxeW77qEa18SOPqJ6AgFw9U3RbsBQ&
rgGSfuxuPldgn2Wgq7gaBQJAXrHAnLP7MVCRfYMABxdOncg+C+PO0nkwos09eAic&
Y9zqqB1JvxVxdx3E5LquULtf4l6POwrTt8P+Oy6dGvDHqw==&
-----END&RSA&PRIVATE&KEY-----&
Public&Key&
-----BEGIN&PUBLIC&KEY-----&
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNS084xZA0cbdjsZxO7nWalECT&
rho2vzt4KjE2dVCmDLOLAEHs7nCrJQmZ9Zu4WJe1HdC4TeHaXu0uc7aHdnX8mWHA&
9wBasPQXSzK5g6MqRrrDLj0xskJhN0oPalyMCfPfDj95aycdw5jMjEz/e7K29tR4&
4I8d+bt9uNc+iEj4DwIDAQAB&
-----END&PUBLIC&KEY-----&
$plaintext&=&&Hello&;
$pubkey&=&openssl_pkey_get_public(file_get_contents(&pub.key&));
$privkey&=&openssl_pkey_get_private(file_get_contents(&pri.key&));
//encrypt&&&decrypt
openssl_public_encrypt($plaintext,$crypted,$pubkey);
openssl_private_decrypt($crypted,$decrypted,$privkey);
echo&&&h1&Plaintext&/h1&&pre&$plaintext&/pre&&;
echo&&&h1&Crypted&/h1&&pre&$crypted&/pre&&;
echo&&&h1&Crypted(base64)&/h1&&pre&&.chunk_split(base64_encode($crypted),&64,&&\n&).&&/pre&&;
echo&&&h1&Decrypted&/h1&&pre&$decrypted&/pre&&;
我从头到尾看了一遍,觉得yctin貌似理解错了。
楼主在13楼描述到:
$prikey&=&mysql_result($result,0,'prikey');&//从数据库得到保存的prikey,这个prikey我在C++组件那里保存之前做了一个bin2ascii的转换。
这就是说,$prikey是C++格式密钥(bin)的ascii格式。我看yctin兄后面的方法似乎都是直接把这个串当做phase&word来处理了&=_=!
关于PHP中DER的函数貌似没有,BASE64的函数也就两个:base64_encode和base64_decode,如果有什么现成的转换函数或者类库,应该也是以算法为主。
因为我本人对算法几乎也是一窍不通,所以没办法给楼主直接性的建议,不过可以想到的是,楼主无非也就以下几种方法来解决这个问题:
1、趁热打铁学习DER的编码格式。首先确实DER是否为可逆,如果可逆,那么用PHP来实现decode的过程,然后decode出来的代码用base64_encode来编码,就OK。
2、用PHP实现C++中的encrypt和decrypt函数(C++中应该有这两个函数吧)的功能。不过这个更难了&=_=!
3、既然已经知道DER的编码是ASN.1的格式,而PHP中用法的是X.509格式,
如果技术上可行的话,应该有其它语言实现这两种编码的互转,找一个能用的,再找个兄弟用PHP帮你实现不就行了。
4、在C++中保存的时候保存公密钥的时候保存两份,一份DER格式的,一份PEM格式的。
先?一下PHP的openssl吧,下面能完整?行就可以了
$configargs&=&array(
&&&&'config'&=&&'C:\xampp\apache\f', //valid&f
//&&&&'digest_alg'&=&&'md5',
//&&&&'x509_extensions'&=&&'v3_ca',
//&&&&'req_extensions'&&&=&&'v3_req',
//&&&&'private_key_bits'&=&&1024,
//&&&&'private_key_type'&=&&OPENSSL_KEYTYPE_RSA,
//&&&&'encrypt_key'&=&&false,
$plaintext&=&&Hello&;
//create&the&keypair
$res=openssl_pkey_new($configargs);
if(empty($res)){
echo&&error:&no&key&was&generated&by&openssl_pkey_new()&;
echo&openssl_error_string();
echo&&a&private&key&was&generated&by&openssl_pkey_new()&;
//get&private&key
openssl_pkey_export($res,&$privkey,null,$configargs);
//$privkey&=&openssl_pkey_get_private($pem); //get&key&from&pem&format&data,&$pem&=&file&path&or&pem&string
//get&public&key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey[&key&];
//encrypt&&&decrypt
openssl_public_encrypt($plaintext,$crypted,$pubkey);
openssl_private_decrypt($crypted,$decrypted,$privkey);
//output&key&file
file_put_contents(&pub.key&,$pubkey);
file_put_contents(&pri.key&,$privkey);
//print&test&result
echo&&&h1&Private&Key&/h1&&pre&$privkey&/pre&&;
echo&&&h1&Public&Key&/h1&&pre&$pubkey&/pre&&;
echo&&&h1&Plaintext&/h1&&pre&$plaintext&/pre&&;
echo&&&h1&Crypted&/h1&&pre&$crypted&/pre&&;
echo&&&h1&Decrypted&/h1&&pre&$decrypted&/pre&&;
$configargs&内的&'config'&=&&'C:\xampp\apache\f'
安装了openseel就有个f
路?换成自己的
先?一下PHP的openssl吧,下面能完整?行就可以了&
PHP&code&?php
$configargs&=&array(
&&&&'config'&=&&'C:\xampp\apache\f',&&&&//valid&f
//&&&&'digest_alg'&=&&'md5',
//&&&&'x509_extensions'&=&&'v3_ca',
//&&&&'req_extensions'&&&=&&'v3_req',
//&&&&'private_key_bits'&=&&1024,
//&&&&'private_key_type'&=&&OPENSSL_KEYTYPE_RSA,
//&&&&'encrypt_key'&=&&false,
private&key&was&generated&by&openssl_pkey_new()
Fatal&error:&Call&to&undefined&function:&openssl_pkey_get_details()&
我的是WINDOWS系统,把这个注释去掉应该就能使用OPENSSL了吧。extension=php_openssl.dll
但是我PHP的版本是PHP4,openssl_pkey_get_details()&这个函数只有PHP5才能使用,所以这段代码运行不过去。。。
不过从这句来看OPENSSL应该是能使用的吧:private&key&was&generated&by&openssl_pkey_new()
我从头到尾看了一遍,觉得yctin貌似理解错了。&
楼主在13楼描述到:&
$prikey&=&mysql_result($result,0,'prikey');&//从数据库得到保存的prikey,这个prikey我在C++组件那里保存之前做了一个bin2ascii的转换。&
这就是说,$prikey是C++格式密钥(bin)的ascii格式。我看yctin兄后面的方法似乎都是直接把这个串当做phase&word来处理了&=_=!&
关于PHP中DER的函数貌似没有,BASE64的函数也就两个:base6…
多谢您的建议。。我也正在参考。。
$prikey是C++格式密钥(bin)的ascii格式,所以在使用之前做过一个处理$der_data&=&&pack(&H*&,$der_data);
我搜到有一个用C++&和&JAVA两种不同的语言进行加解密的示例。。&
其中有两个函数我觉得比较关键,我在JAVA版问过,不过好像有研究过的朋友不多。。。
&&&*&从公钥数据取得公钥
&&&*&@param&bPubKeyInput
&&&*&@return
&&PublicKey&getRsaPubKey(byte[]&bPubKeyInput)&{
&&&&byte[]&bX509PubKeyHeader&=&{
&&&&&&&&48,&-127,&-97,&48,&13,&6,&9,&42,&-122,&72,&-122,&-9,&13,&1,&1,&1,&5,&0,
&&&&&&&&3,&-127,&-115,&0};
&&&&&&byte[]&bPubKey&=&new&byte[bPubKeyInput.length&+&bX509PubKeyHeader.length];
&&&&&&System.arraycopy(bX509PubKeyHeader,&0,&bPubKey,&0,
&&&&&&&&&&&&&&&&&&&&&&&bX509PubKeyHeader.length);
&&&&&&System.arraycopy(bPubKeyInput,&0,&bPubKey,&bX509PubKeyHeader.length,
&&&&&&&&&&&&&&&&&&&&&&&bPubKeyInput.length);
&&&&&&X509EncodedKeySpec&rsaKeySpec&=&new&X509EncodedKeySpec(bPubKey);
&&&&&&KeyFactory&keyFactory&=&KeyFactory.getInstance(&RSA&);
&&&&&&rsaPubKey&=&keyFactory.generatePublic(rsaKeySpec);
&&&&catch&(Exception&e)&{
&&&&&&e.printStackTrace();
&&&&return&rsaPubK
PHP4&...&那时我还没玩过RSA&=.=||
php6都快出来了,怎么还在用php4&
openssl&的版本都不相同
版本相差太大...没法试
另外...C++&的openssl&都可以出&PEM&的
http://www.openssl.org/docs/crypto/pem.html#PEM_FUNCTION_ARGUMENTS
PHP4&...&那时我还没玩过RSA&=.=||&
php6都快出来了,怎么还在用php4&
openssl&的版本都不相同&
版本相差太大...没法试&
大哥,我重新装了一个PHP5。
$configargs&=&array(
&&&&'config'&=&&'C:\xampp\apache\f',&&&&//valid&f
//&&&&'digest_alg'&=&&'md5',
//&&&&'x509_extensions'&=&&'v3_ca',
//&&&&'req_extensions'&&&=&&'v3_req',
//&&&&'private_key_bits'&=&&1024,
//&&&&'private_key_type'&=&&OPENSSL_KEYTYPE_RSA,
//&&&&'encrypt_key'&=&&false,
$plaintext&=&&Hello&;
//create&the&keypair
$res=openssl_pkey_new($configargs);
if(empty($res)){
&&&&echo&&error:&no&key&was&generated&by&openssl_pkey_new()&;
&&&&echo&openssl_error_string();
&&&&echo&&a&private&key&was&generated&by&openssl_pkey_new()&;
//get&private&key
openssl_pkey_export($res,&$privkey,null,$configargs);
//$privkey&=&openssl_pkey_get_private($pem);&&&&//get&key&from&pem&format&data,&$pem&=&file&path&or&pem&string
//get&public&key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey[&key&];
//encrypt&&&decrypt
openssl_public_encrypt($plaintext,$crypted,$pubkey);
openssl_private_decrypt($crypted,$decrypted,$privkey);
//output&key&file
file_put_contents(&pub.key&,$pubkey);
file_put_contents(&pri.key&,$privkey);
//print&test&result
echo&&&h1&Private&Key&/h1&&pre&$privkey&/pre&&;
echo&&&h1&Public&Key&/h1&&pre&$pubkey&/pre&&;
echo&&&h1&Plaintext&/h1&&pre&$plaintext&/pre&&;
echo&&&h1&Crypted&/h1&&pre&$crypted&/pre&&;
echo&&&h1&Decrypted&/h1&&pre&$decrypted&/pre&&;
这段代码能运行通过了。。。
但是,密钥格式的问题似乎仍然存在。。。
由于我是从MYSQL数据中得到的密钥数据
$DerPriKey&=&&pack(&H*&,$prikey);
$DerPubKey&=&&pack(&H*&,$pubkey);
再DER&to&BASE64
//$pemPriKey&=&chunk_split(base64_encode($DerPriKey),&64,&&\n&);
$pemPriKey&=&base64_encode($DerPriKey);
$pemPriKey&=&&-----BEGIN&RSA&PRIVATE&KEY-----\n&.$pemPriKey.&-----END&RSA&PRIVATE&KEY-----\n&;
-----BEGIN&RSA&PRIVATE&KEY-----
MIICXAIBAAKBgQDG7ztZmQzFHGJvpzTW7Uu5drsirqvOMRU4B4cULCWfMkn5nkf2
L/oLMf004H3LWCUSIdi4xWsFYuwnKH+qhHuhPbsQ4mWcN+FR+u8/MHmtv2XPOiGA
rtQLfDCjZNNBqUGLPap8eTjAMovOCYTmhR6FHVV7izQhILXk7z7szMua3wIDAQAB
AoGATDt8yNbnl9lKt3KhwwLoE8g16hJ5b+hLM09fKhHI0Pqacnd/KA42iXe8ijjE
u9mpSwuBWzz7x/KigFb6pUNjhDaFQCv1YKzBiQrkRDrm2ecBXBrBi2LMHe9mrxXm
C34xk/rDPENGvY39HxS4BP21O5xYmYO0CCVgJux/WdMkGIECQQD7cUDEXQKS816f
rDPM7lCSJfKPFYpe3pcdAfO02P/OoeCtteEQ6zqV/F/tX27bj20RA20x3n0UVUXh
OvUbFZVhAkEAyopUs8ftEQ9oZORA9D2USMzED1BRhTw14/Tx+uimJ+EwPJSdTFeL
Ox+tiR/Ng9H9oX2FyyO8IaiQaQU6b7LYPwJAKxnUwlQ3Nr1lAPXhw0Uupn6+v2wv
1edN+/jzr5Jq9x6khuJgfCf2WPNz9hqfxB8n0PzHYP8EbdHYMq2KimP+wQJBAMbR
xdX5QpjFpDet7KkVLdPM1gUmVe/RLCGKmGMyL7DkGCLPzB1drnoqXYJG6sokv7Hf
8w93E72Cp8e/7x4o1KcCQAvcYfpPRJsgJU09Pub25PrVPrDybnjLl8SFclR0zFXx
/tyM+pArnpRlP+JWYqyEhY4Tm7+bMFnm6FZlQdA4H4Q=
-----END&RSA&PRIVATE&KEY-----
DER&to&PEM
-----BEGIN&PUBLIC&KEY-----
MIGJAoGBAMbvO1mZDMUcYm+nNNbtS7l2uyKuq84xFTgHhxQsJZ8ySfmeR/Yv+gsx
/TTgfctYJRIh2LjFawVi7Ccof6qEe6E9uxDiZZw34VH67z8wea2/Zc86IYCu1At8
MKNk00GpQYs9qnx5OMAyi84JhOaFHoUdVXuLNCEgteTvPuzMy5rfAgMBAAE=
-----END&PUBLIC&KEY-----
不管我用$pemPriKey&=&base64_encode($DerPriKey);
$pemPriKey&=&chunk_split(base64_encode($DerPriKey),&64,&&\n&);
$pubkey&=&openssl_pkey_get_public($pemPubKey);
//encrypt&&&decrypt
openssl_public_encrypt($plaintext,$crypted,$pubkey);
openssl_private_decrypt($crypted,$decrypted,$privkey);
Warning:&openssl_public_encrypt()&[function.openssl-public-encrypt]:&key&parameter&is&not&a&valid&public&key&
Warning:&openssl_private_decrypt()&[function.openssl-private-decrypt]:&key&parameter&is&not&a&valid&private&key
这是否意味着DER&到&base64编码只使用base64_encode($DerPriKey);是不能得到到有效格式的密钥的?
-----BEGIN&RSA&PRIVATE&KEY-----
MIICXAIBAAKBgQDG7ztZmQzFHGJvpzTW7Uu5drsirqvOMRU4B4cULCWfMkn5nkf2
L/oLMf004H3LWCUSIdi4xWsFYuwnKH+qhHuhPbsQ4mWcN+FR+u8/MHmtv2XPOiGA
rtQLfDCjZNNBqUGLPap8eTjAMovOCYTmhR6FHVV7izQhILXk7z7szMua3wIDAQAB
AoGATDt8yNbnl9lKt3KhwwLoE8g16hJ5b+hLM09fKhHI0Pqacnd/KA42iXe8ijjE
u9mpSwuBWzz7x/KigFb6pUNjhDaFQCv1YKzBiQrkRDrm2ecBXBrBi2LMHe9mrxXm
C34xk/rDPENGvY39HxS4BP21O5xYmYO0CCVgJux/WdMkGIECQQD7cUDEXQKS816f
rDPM7lCSJfKPFYpe3pcdAfO02P/OoeCtteEQ6zqV/F/tX27bj20RA20x3n0UVUXh
OvUbFZVhAkEAyopUs8ftEQ9oZORA9D2USMzED1BRhTw14/Tx+uimJ+EwPJSdTFeL
Ox+tiR/Ng9H9oX2FyyO8IaiQaQU6b7LYPwJAKxnUwlQ3Nr1lAPXhw0Uupn6+v2wv
1edN+/jzr5Jq9x6khuJgfCf2WPNz9hqfxB8n0PzHYP8EbdHYMq2KimP+wQJBAMbR
xdX5QpjFpDet7KkVLdPM1gUmVe/RLCGKmGMyL7DkGCLPzB1drnoqXYJG6sokv7Hf
8w93E72Cp8e/7x4o1KcCQAvcYfpPRJsgJU09Pub25PrVPrDybnjLl8SFclR0zFXx
/tyM+pArnpRlP+JWYqyEhY4Tm7+bMFnm6FZlQdA4H4Q=
-----END&RSA&PRIVATE&KEY-----&
上面的是你生成的private&key?
我用这条key可以生成public&key,进行加密解密啊
但生出来的public&key跟你不同
-----BEGIN&PUBLIC&KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDG7ztZmQzFHGJvpzTW7Uu5drsi
rqvOMRU4B4cULCWfMkn5nkf2L/oLMf004H3LWCUSIdi4xWsFYuwnKH+qhHuhPbsQ
4mWcN+FR+u8/MHmtv2XPOiGArtQLfDCjZNNBqUGLPap8eTjAMovOCYTmhR6FHVV7
izQhILXk7z7szMua3wIDAQAB
-----END&PUBLIC&KEY-----
-----BEGIN&RSA&PRIVATE&KEY-----&
MIICXAIBAAKBgQDG7ztZmQzFHGJvpzTW7Uu5drsirqvOMRU4B4cULCWfMkn5nkf2&
L/oLMf004H3LWCUSIdi4xWsFYuwnKH+qhHuhPbsQ4mWcN+FR+u8/MHmtv2XPOiGA&
rtQLfDCjZNNBqUGLPap8eTjAMovOCYTmhR6FHVV7izQhILXk7z7szMua3wIDAQAB&
AoGATDt8yNbnl9lKt3KhwwLoE8g16hJ5b+hLM09fKhHI0Pqacnd/KA42iXe8ijjE&
u9mpSwuBWzz7x/KigFb6pUNjhDaFQCv1YKzBiQrkRDrm2ecBXBrBi2LMHe9mrxXm&
C34xk/rDPENGvY39HxS4BP21O5xYm…
是我用C++生成的privateKey&和publicKey,我把他们都保存在MYSQL数据库里了。。
有一点我一直很奇怪。。。我一开始只贴了私钥,你怎么得到公钥的呢。。。如果公钥可以用私钥算出来。。那就没什么安全性可言了
我想把公钥和私钥贴出来。。但是老提示“回复中存在非法字符”。。。
“有太长的字符存在,为了避免影响显示效果,请在其中加空格或者回车。避免影响显示效果!”
我加了空格回车也还是这个提示。。
我用openssl的命令行生出private&key及public&key
再用php由该private&key&生成public&key
结果得出一条相同的public&key
证明两者在生成上是一样的
//gen&private&key
openssl&genrsa&-out&private.key&1024
//gen&public&key&from&private&key
openssl&rsa&-in&private.key&-pubout&-out&public.key
我想把公钥和私钥贴出来。。但是老提示“回复中存在非法字符”。。。
“有太长的字符存在,为了避免影响显示效果,请在其中加空格或者回车。避免影响显示效果!”
我加了空格回车也还是这个提示。。
公钥本来就是用私钥算出来的
可是我只给出了私钥。。。按理说你是不能根据私钥算出公钥的呀。。。。
不然,只要知道私钥或者知道公钥,就可以计算出彼此,那谈何非对称加密?
是不是我有哪里搞错了-_-
openssl&rsa&-in&private.key&-pubout&-out&public.key&
载入private&key?,生成public&key?
那你说public.key&那里来的=.=
刚看了openssl的源码
//生成RSA&private&key
RSA_generate_key_ex(rsa,&num,&bn,&&cb)
PEM_write_bio_RSAPrivateKey
openssl&rsa&-in&private.key&-pubout&-out&public.key&
载入private&key?,生成public&key?&
那你说public.key&那里来的=.=&
我不会用OPENSSL的命令行
在C++里,我是这样得到的
m_pRsa&=&RSA_new();
m_pRsa&=&RSA_generate_key(m_rsa_bits,RSA_F4,NULL,NULL);
这样就生成了密钥对了,信息都保存在m_pRsa这个结构体指针里。。
我要将公钥和私钥提取出来,于是我用
//得到公钥到pt
len&=&i2d_RSAPublicKey(m_pRsa,&&Pt);&//*pt就是我保存在MYSQL数据库里的公钥信息
同理保存私钥
//得到私钥到pt
len&=&i2d_RSAPrivateKey(m_pRsa,&&Pt);//*pt就是我保存在MYSQL数据库里的私钥信息
照这么看,如果是可以用private.key文件得到一个public.key文件
openssl&rsa&-in&private.key&-pubout&-out&public.key&
那么。。private.key必然已经包含了RSA算法中&P&Q&N&E&D五个数的全部信息了
(我没理解错的话:一般私钥是指P,&Q,&d,公钥是N和e),所以能从私钥文件生成公钥文件。
那么我想,
我用i2d_这两个函数保存的私钥和公钥信息是不是也是这样,私钥保存了全部五个数的信息?(确实私钥信息比公钥信息要长很多,一个是608,一个是140)
我在13楼给出的是私钥的数据。。大哥,你能根据这个私钥数据算出公钥来么?
你在32楼贴出的公钥就是这么算来的?好像和我用C++保存的数据不一样。。
C++里我得到的公钥是这个。。
/happy/thread--1.html(CSDN不接受这么长的字符串,所以我发到另外一个PHP论坛里了)
大哥你看下是不是一样的?
刚看了openssl的源码&
//生成RSA&private&key&
RSA_generate_key_ex(rsa,&num,&bn,&&cb)&
PEM_write_bio_RSAPrivateKey&
也就是说在DER转BASE64无望的情况下。。
我还可以考虑用C++生成PEM的私钥文件,并保存在MYSQL中,然后使用PHP得到密钥来进行解密或者加密?
难道i2d_RSAPublicKey这个函数得到的密钥数据是无法转化为在PHP中可用的密钥的么?
(OPENSSL提供了一个相应的逆函数&d2i_RSAPrivateKey就可以重新设置密钥信息,但PHP似乎无法用这个函数)
int&PEM_write_bio_RSAPrivateKey(BIO&*bp,&RSA&*x,&const&EVP_CIPHER&*enc,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&unsigned&char&*kstr,&int&klen,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&pem_password_cb&*cb,&void&*u);
int&PEM_write_RSAPrivateKey(FILE&*fp,&RSA&*x,&const&EVP_CIPHER&*enc,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&unsigned&char&*kstr,&int&klen,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&pem_password_cb&*cb,&void&*u);
汗~很久没玩C了,看得头昏
openssl&command&line&使用&PEM_write_bio_RSAPrivateKey&将&RSA&key&写入档案
PEM_write_bio_RSAPrivateKey&最后调用&PEM_write_bio
将RSA&key用base64&编码及加上&begin&,end&写入档案
openssl&官网描述&PEM&function
DESCRIPTION
The&PEM&functions&read&or&write&structures&in&PEM&format.&In&this&sense&PEM&format&is&simply&base64&encoded&data&surrounded&by&header&lines
PEM&格式只是DER做一次base64&,加档头档尾
int&PEM_write_bio(BIO&*bp,&const&char&*name,&char&*header,&unsigned&char&*data,
&&&&&long&len)
int&nlen,n,i,j,
unsigned&char&*buf&=&NULL;
EVP_ENCODE_CTX&
int&reason=ERR_R_BUF_LIB;
EVP_EncodeInit(&ctx);
nlen=strlen(name);
if&( (BIO_write(bp,&-----BEGIN&&,11)&!=&11)&||
(BIO_write(bp,name,nlen)&!=&nlen)&||
(BIO_write(bp,&-----\n&,6)&!=&6))
i=strlen(header);
if&(i&&&0)
if&( (BIO_write(bp,header,i)&!=&i)&||
(BIO_write(bp,&\n&,1)&!=&1))
buf&=&OPENSSL_malloc(PEM_BUFSIZE*8);
if&(buf&==&NULL)
reason=ERR_R_MALLOC_FAILURE;
while&(len&&&0)
n=(int)((len&(PEM_BUFSIZE*5))?(PEM_BUFSIZE*5):len);
EVP_EncodeUpdate(&ctx,buf,&outl,&(data[j]),n);
if&((outl)&&&&(BIO_write(bp,(char&*)buf,outl)&!=&outl))
EVP_EncodeFinal(&ctx,buf,&outl);
if&((outl&&&0)&&&&(BIO_write(bp,(char&*)buf,outl)&!=&outl))&goto&
OPENSSL_cleanse(buf,&PEM_BUFSIZE*8);
OPENSSL_free(buf);
buf&=&NULL;
if&( (BIO_write(bp,&-----END&&,9)&!=&9)&||
(BIO_write(bp,name,nlen)&!=&nlen)&||
(BIO_write(bp,&-----\n&,6)&!=&6))
return(i+outl);
if&(buf)&{
OPENSSL_cleanse(buf,&PEM_BUFSIZE*8);
OPENSSL_free(buf);
PEMerr(PEM_F_PEM_WRITE_BIO,reason);
return(0);
汗~很久没玩C了,看得头昏&
openssl&command&line&使用&PEM_write_bio_RSAPrivateKey&将&RSA&key&写入档案&
PEM_write_bio_RSAPrivateKey&最后调用&PEM_write_bio&
将RSA&key用base64&编码及加上&begin&,end&写入档案&
openssl&官网描述&PEM&function&
DESCRIPTION&
The&PEM&functions&read&or&write&structures&in&PEM&format.&In&this&sense&PEM&format&is&simply&base64&encoded&data&surrounded&by&header&lines&
PEM&格式只是DER做一次base64&,加档头档尾&
PEM&格式只是DER做一次base64&,加档头档尾&
那就是说DER是可以转成PEM的?这个过程用PHP如何实现呢?
我理解照这个说法,下面的代码应该是可行的???
$prikey&=&mysql_result($result,0,'prikey');&//从数据库读出
$DerPriKey&=&&pack(&H*&,$prikey);&&&//ASCII2BIN
$pemPriKey&=&base64_encode($DerPriKey);&//“做一次base64“
$pemPriKey&=&&-----BEGIN&RSA&PRIVATE&KEY-----\n&.$pemPriKey.&-----END&RSA&PRIVATE&KEY-----\n&;&//加上头尾
$privkey&=&openssl_pkey_get_private($pemPriKey);&//得到私钥
$privkey&=&openssl_pkey_get_private($pri);//同样的方法从数据库得到公钥
openssl_public_encrypt($plaintext,$crypted,$pubkey);&//用公钥加密
openssl_private_decrypt($crypted,$decrypted,$privkey);&//用私钥解密
可是在实践中,会提示$privkey和$pubkey不是有效的参数,这应该是$privkey和$pubkey没转换成有效的密钥的缘故。
上面的代码纠正一个小错误。。
$privkey&=&openssl_pkey_get_private($pemPriKey);&//得到私钥&
$pubkey&=&openssl_pkey_get_public($pub);//同样的方法从数据库得到公钥&
你那个当然不行...
我上面不就给过你&DER&to&PEM&的代码吗?
我用你贴出来的key都成功了
看完openssl&的源码后
我基本上100%确定可以做到
你那个当然不行...&
我上面不就给过你&DER&to&PEM&的代码吗?&
我用你贴出来的key都成功了&
看完openssl&的源码后&
我基本上100%确定可以做到&
我把我的代码和KEY都给出来,您抽个空看看好不?
$db&=&mysql_connect(&localhost&,&&root&);
mysql_select_db(&mysql&,$db);
$result&=&mysql_query(&SELECT&*&FROM&test&WHERE&username=&'g'&,$db);
$prikey&=&&c6ef3b5fa734d6ed4bb976bb22aeabce2c259ff62ffa0b31fd34e07dcbb8c56bfaa847ba13dbb10efaef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7cbce1d557b8be4ef3eeccccb9adfcc8d6e797d94ab772a1c302e813c835ea1f5f2a11c8d0fa9ac4bbd9a94b0b815b3cfbc7f2a28056faa02bf560accae6d9eb62cc1def66af15e60b7e3193fac33c4346bd8dfd1f14b804fdb53b9cf59d0fb2f35e9fac33cceef158a5ede971d01f3b4d8ffcea1e0adb5e110eb3a95fc5fed5f6edb8f6ddaf51bca8a54b3c7ed110fd9448ccc40fe3f4f1fae8a627ec578b3b1fad891fcd83d1fda17d85cb23bc21afb2d83fc00f5e1c3452ea67ebebf6c2fd5e74dfbf8f3af926af71ea486ef373f61a9fc41f27d0fcc760ff046dd1d832ad8a8a63fecd1c5d5fadeca9152dd3ccd6052655efd12c218ae41822cfcc1d5dae7a2a5d8246eaca24bfb1dff30fc7bfef1e28d4a702400bdc61fa4f449bee6f6e4fad53eb0f26e78cb97ccc55f1fedc8cfa902b9e9acbbf9b&;&
$pubkey&=&&00c6ef3b5fa734d6ed4bb976bb22aeabce2c259ff62ffa0b31fd34e07dcbb8c56bfaa847ba13dbb10efaef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7cbce1d557b8be4ef3eeccccb9adf&;
$DerPriKey&=&&pack(&H*&,$prikey);
$DerPubKey&=&&pack(&H*&,$pubkey);
$pemPriKey&=&chunk_split(base64_encode($DerPriKey),&64,&&\n&);
$pemPriKey&=&&-----BEGIN&RSA&PRIVATE&KEY-----\n&.$pemPriKey.&-----END&RSA&PRIVATE&KEY-----\n&;
$pemPubKey&=&chunk_split(base64_encode($DerPubKey),&64,&&\n&);
$pemPubKey&=&&-----BEGIN&PUBLIC&KEY-----\n&.$pemPubKey.&-----END&PUBLIC&KEY-----\n&;
$RealPriKey&=&&openssl_pkey_get_private($pemPriKey);
$RealPubKey&=&&openssl_pkey_get_public($pemPubKey);&
$message=&ABCD&;
openssl_public_encrypt($message,$encoded,$RealPubKey);
openssl_private_decrypt($encoded,$decoded,$RealPriKey);
echo&&&b&Message:&/b&&$message&br&/&\n&;
echo&&&b&Encoded:&/b&&$encoded&br&/&\n&;
echo&&&b&Decoded:&/b&&$decoded&br&/&\n&;
echo&&Success:&&.(($decoded&==&$message)&?&&True&&:&&False&).&&hr&/&\n&;
那是因为你的public&key&是错的
$RealPriKey&=&&openssl_pkey_get_private($pemPriKey);
//$RealPubKey&=&&openssl_pkey_get_public($pemPubKey);
$RealPubKey=openssl_pkey_get_details($RealPriKey);
$RealPubKey=$RealPubKey[&key&];
正常public&key根本不是你那条
你那条public&key比正常的短...
闪人~明天再会

我要回帖

更多关于 win10家庭版和专业版 的文章

 

随机推荐