非常感谢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程序可以互相加解密呢。。。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
回复次数:54
bookmoth用户头像
bookmoth
(书中蠹鱼)
等 级:
#1楼 得分:0回复于:2009-02-10 15:01:42
手册里面有人给写的评论,不知道对你有用没有:
HTML code
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>
HTML code
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>
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:在c/c++中怎样获得系统的时间
bookmoth用户头像
bookmoth
(书中蠹鱼)
等 级:
#2楼 得分:20回复于:2009-02-10 15:02:18
如需要阅读该回复,请登录或注册CSDN!
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:前天面深信服的一套比试题 有点意思~~~~ 大家研究下好么?
imdemon用户头像
imdemon
(魔殇)
等 级:
#3楼 得分:0回复于:2009-02-10 15:55:34
多些bookmoth兄给的参考。。。。
我也觉得是我对密钥的格式不理解造成的。。。。
在C++中,我使用了这两个函数来使密钥被保存和设置
d2i_RSAPublicKey() and i2d_RSAPublicKey() decode and encode a PKCS#1 RSAPublicKey structure.
但PHP的OPENSSL中,似乎没有相对应的函数可供使用。。
我对OPENSSL乃至加密签名并不了解,正在费力地搜索+阅读中。。请有经验的大哥指条明路。。。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:进程的问题
bookmoth用户头像
bookmoth
(书中蠹鱼)
等 级:
#4楼 得分:0回复于:2009-02-10 15:59:45
你把C++生成的密钥写到文件里,看看格式是什么样子的。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:超级恶心的面试题
imdemon用户头像
imdemon
(魔殇)
等 级:
#5楼 得分:0回复于:2009-02-10 16:54:04
是这样。。。我用C++生成了密钥后,密钥保存在struct RSA这个结构体里,
然后我调用了len = i2d_RSAPublicKey(m_pRsa, &Pt);
pt里面就是公钥数据了。。至于格式好象没有什么特别的,就是一串二进制编码。。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:2008三句半(半原创)
bookmoth用户头像
bookmoth
(书中蠹鱼)
等 级:
#6楼 得分:0回复于:2009-02-10 17:02:00
那你按照ssh-rsa <keydata>
这样的格式,弄成个文件,去php里试试啊。
看那个keydata好像是base64类似物编码过的二进制。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#7楼 得分:55回复于:2009-02-10 17:36:02
如需要阅读该回复,请登录或注册CSDN!
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#8楼 得分:0回复于:2009-02-10 17:58:44
引用 6 楼 bookmoth 的回复:
那你按照ssh-rsa <keydata>
这样的格式,弄成个文件,去php里试试啊。
看那个keydata好像是base64类似物编码过的二进制。
多谢大哥耐心的指点。。
好像在前面加个头后还要经过一系列处理。。。我的问题正是我不太清楚如何去处理。。。
我搜了个文章,是C++和JAVA使用OPENSSL加解密的代码示例。。
http://blog.csdn.net/boise/archive/2005/07/03/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};
try {
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 rsaPubKey;
}
似乎是在公钥信息前加上一段固定的"头"。。。。然后经过一些处理,就可以得到"真正的"公钥了。。但是这个代码是JAVA代码。
我想如果有个PHP版本的这个函数就好了。。。而JAVA 和 PHP我都不懂。。X.509这个标准(格式?)我也是刚知道-_-!。。真令人沮丧啊。。。
如何将C++中使用i2d_RSAPublicKey(m_pRsa, &Pt);保存下来的密钥信息恢复成"真正的"密钥。。。。。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#9楼 得分:0回复于:2009-02-10 18:08:16
引用 7 楼 yctin 的回复:
楼主写个php扩展用来解密 ^_^"
大哥。。。我搜索了一下资料,我想勉强可以写WIN下的PHP扩展,但是LINUX的的扩展我可就懵了。。。
这个东西得用在LINUX服务器上的,所以最好能直接用PHP解决。。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
froole用户头像
froole
(loveapple)
等 级:
3
#10楼 得分:5回复于:2009-02-10 18:36:03
PEAR有类库,lz看看这里,很多东西不需要自己写。
http://pear.php.net/reference/Crypt_RSA-1.0.0/Crypt_RSA/_Crypt_RSA-1.0.0_RSA_php.html
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#11楼 得分:0回复于:2009-02-11 11:17:20
引用 10 楼 froole 的回复:
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编码)提供帮助的朋友么?
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#12楼 得分:0回复于:2009-02-11 11:23:05
你不如贴上你生成的 private key,public key,明文,密文上来吧
现在根本不知道你生成了什么
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#13楼 得分:0回复于:2009-02-11 11:51:30
引用 12 楼 yctin 的回复:
你不如贴上你生成的 private key,public key,明文,密文上来吧
现在根本不知道你生成了什么
好的,是这样,我贴一下PHP代码
$prikey = mysql_result($result,0,'prikey'); //从数据库得到保存的prikey,这个prikey我在C++组件那里保存之前做了一个bin2ascii的转换。
echo $prikey;
//这样得到的输出是:3082025c02010002818100c6ef3b59990cc51c626fa734d6ed4bb976bb22aeabce3115380787142c259f3249f99e47f62ffa0b31fd34e07dcb58251221d8b8c56b0562ec27287faa847ba13dbb10e2659c37e151faef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7c7938c0328bce0984e6851e851d557b8b342120b5e4ef3eeccccb9adf02030100010281804c3b7cc8d6e797d94ab772a1c302e813c835ea12796fe84b334f5f2a11c8d0fa9a72777f280e368977bc8a38c4bbd9a94b0b815b3cfbc7f2a28056faa54363843685402bf560acc1890ae4443ae6d9e7015c1ac18b62cc1def66af15e60b7e3193fac33c4346bd8dfd1f14b804fdb53b9c589983b408256026ec7f59d3241881024100fb7140c45d0292f35e9fac33ccee509225f28f158a5ede971d01f3b4d8ffcea1e0adb5e110eb3a95fc5fed5f6edb8f6d11036d31de7d145545e13af51b159561024100ca8a54b3c7ed110f6864e440f43d9448ccc40f5051853c35e3f4f1fae8a627e1303c949d4c578b3b1fad891fcd83d1fda17d85cb23bc21a89069053a6fb2d83f02402b19d4c2543736bd6500f5e1c3452ea67ebebf6c2fd5e74dfbf8f3af926af71ea486e2607c27f658f373f61a9fc41f27d0fcc760ff046dd1d832ad8a8a63fec1024100c6d1c5d5f94298c5a437adeca9152dd3ccd6052655efd12c218a9863322fb0e41822cfcc1d5dae7a2a5d8246eaca24bfb1dff30f7713bd82a7c7bfef1e28d4a702400bdc61fa4f449b20254d3d3ee6f6e4fad53eb0f26e78cb97c485725474cc55f1fedc8cfa902b9e94653fe25662ac84858e139bbf9b3059e6e8566541d0381f84
//所以我要转换回来,下面我做一个ASCII2BIN的转换
$realPriKey = pack("H*",$prikey);
echo $realPriKey;
//得到的输出是:
0‰Æï;Y™ Åbo§4ÖíK¹v»"®«Î18‡,%Ÿ2IùžGö/ú 1ý4à}ËX%!ظÅkbì'(ª„{¡=»âeœ7áQúï?0y¿eÏ:!€®Ô |0£dÓA©A‹=ª|y8À2‹Î „æ……U{‹4! µäï>ìÌËšß
//可以看到,二进制的密钥数据很多都是不可显示字符比如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)格式编码的密钥
所以,我需要将密钥格式进行一个转换。。。
我不知道我是否描述清楚了?
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#14楼 得分:0回复于:2009-02-11 11:56:46
我把密钥保存在文件里。。用WINHEX打开是这样的形式。。。我这这个DER编码的密钥,如何将其转成BASE64编码格式的?
00000000 30 82 02 5D 02 01 00 02 81 81 00 EA 3F AE 89 C9 0?]....亖.?畨?
00000016 9E 47 3C 2C E7 E3 84 A1 2D 4D C0 25 EE 70 4A 70 濭<,玢劇-M?頿Jp
00000032 43 A5 76 D1 8D 60 59 A3 E0 3A D4 C7 79 82 18 06 C褝`Y`:郧y?.
00000048 F7 D5 A4 8F 32 F8 F9 F0 F9 58 1A 2E 2B FE BC 57 髡2瘗X..+W
00000064 35 67 6C 56 51 35 9A D4 58 0B A2 C9 C7 71 27 1E 5glVQ5氃X.⑸莙'.
00000080 71 F7 A9 9F 5D AB 08 41 0D C3 F2 52 FE 60 F2 4A q鳗焆?A.抿R騄
00000096 C3 A7 11 68 32 0A A1 05 30 0F 60 86 79 3D 40 08 莽.h2.?0.`唝=@.
00000112 9A 09 94 FA 3D EF 40 7F 7E 24 72 D4 3D C0 D6 81 ?旡=顯~$r?乐?
00000128 D1 97 2D 18 53 5D 47 FC DD A0 25 02 01 03 02 81 褩-.S]G?....?
00000144 81 00 9C 2A 74 5B DB BE DA 28 1D EF ED 03 16 1E ??t[劬?.镯...
00000160 33 D5 6E 9E F5 86 F5 82 6E 4F 36 5E 40 3B C2 95 3課烏嗸俷O6^@;聲
00000176 7C 8D DA 51 01 65 59 FA 8E 6D B4 CC A5 FB F5 FB |嵹Q.eY鷰m刺觖
00000192 90 11 74 1D 54 7D 8F 78 EF 9D 8E E0 CE 67 38 3A ?t.T}弜餄庎蝕8:
00000208 B2 6B 40 01 2B 00 D1 9B 5F 17 84 7A 60 BE 6F 71 瞜@.+.褯_.剒`緊q
00000224 AA 54 72 96 A9 63 2A 58 6E 80 C7 2D 29 D7 5E 8C 猅r柀c*Xn€?)譤?
00000240 99 DC 4A 9C B6 B2 69 F9 F2 1D 1E 5F CD FC A5 09 欆J湺瞚.._忘?
00000256 A3 D5 4D 9C FE EA 77 98 4E B2 8B F4 04 D2 65 C0 UM滯陊楴矉?襡?
00000272 C1 33 02 41 00 F6 1F 28 E2 FE AD 62 5F 93 D0 0D ?.A.?(恂璪_撔.
00000288 C2 0E 09 8C F4 88 5B ED CE 97 B8 FB 68 6F 05 D4 ?.岕圼砦椄鹔o.?
00000304 2E EB 42 54 53 6F FB 37 AE 76 4F 41 AD 64 12 0C .隑TSo?畍OA璬..
00000320 39 BB C7 DF 0F 29 12 5C 23 2E 5C C0 07 9D DA FE 9磺?).\#.\?澸?
00000336 EF C1 97 F5 FB 02 41 00 F3 A6 87 C2 E5 5B 86 A6 锪楑?A.螃嚶錥啨
00000352 C4 D6 0C 28 8B D9 B7 7F 1E C0 75 0E F3 86 05 E7 闹.(嬞?.纔.髥.?
00000368 CE 68 77 AF 0C 1A D4 42 A6 92 F3 85 F3 53 DC BB 蝖w?.訠髤骃芑
00000384 E8 9C 2E 0B CC 27 CF A3 B6 BF E6 53 A0 10 61 19 铚..?希犊鍿?a.
00000400 A8 8A 57 1C A2 A4 88 5F 02 41 00 A4 14 C5 EC A9 ▕W.ⅳ坃.A.?澎?
00000416 C8 EC 3F B7 E0 09 2C 09 5B B3 4D B0 3D 49 34 65 褥?粪.,.[矼?I4e
00000432 25 FC F0 4A 03 E2 C9 F2 2C 38 37 9F FC CF C9 A4 %J.馍?87燑仙?
00000448 34 D6 73 98 0C 08 26 7D 2F EA 0A 1B 61 92 C2 1E 4謘?.&}/?.a捖.
00000464 E8 80 05 13 E7 54 9F D6 65 4E A7 02 41 00 A2 6F 鑰..鏣熤eN?A.
00000480 05 2C 98 E7 AF 19 D8 8E B2 C5 B2 91 24 FF 69 D5 .,樼?貛才矐$i?
00000496 A3 5F 4D 04 03 EF DE F0 4F CA 08 11 E2 D7 19 B7 M..镛餙?.庾.?
00000512 4D 03 F7 8D 3D D2 9B 12 C9 5D 32 C5 35 17 CF 2A M.鲘=覜.蒥2?.?
00000528 99 8D 15 60 40 BB C5 B1 8F 68 6C 6D B0 3F 02 41 檷.`@慌睆hlm?.A
00000544 00 C7 48 18 B6 27 E1 9E 6D B3 C2 E7 0A 3E C0 A0 .荋.?釣m陈?>罓
00000560 24 A7 2C EB AE 28 46 03 94 1E 7E 2B 74 FE 87 EB $?氘(F.?~+t?
00000576 A0 74 D0 E2 6E D7 6D A0 AE 5C 84 A9 3E 89 0A D2 爐锈n譵牣\劑>??
00000592 1D 4F 7F 83 4D 91 FC F5 22 9A D3 87 34 65 27 58 .O僊扅?氂?e'X
00000608 51 Q
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#15楼 得分:0回复于:2009-02-11 16:59:20
PHP code
$der_data = "3082025c02010002818100c6ef3b59990cc51c626fa734d6ed4bb976bb22aeabce3115380787142c259f3249f99e47f62ffa0b31fd34e07dcb58251221d8b8c56b0562ec27287faa847ba13dbb10e2659c37e151faef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7c7938c0328bce0984e6851e851d557b8b342120b5e4ef3eeccccb9adf02030100010281804c3b7cc8d6e797d94ab772a1c302e813c835ea12796fe84b334f5f2a11c8d0fa9a72777f280e368977bc8a38c4bbd9a94b0b815b3cfbc7f2a28056faa54363843685402bf560acc1890ae4443ae6d9e7015c1ac18b62cc1def66af15e60b7e3193fac33c4346bd8dfd1f14b804fdb53b9c589983b408256026ec7f59d3241881024100fb7140c45d0292f35e9fac33ccee509225f28f158a5ede971d01f3b4d8ffcea1e0adb5e110eb3a95fc5fed5f6edb8f6d11036d31de7d145545e13af51b159561024100ca8a54b3c7ed110f6864e440f43d9448ccc40f5051853c35e3f4f1fae8a627e1303c949d4c578b3b1fad891fcd83d1fda17d85cb23bc21a89069053a6fb2d83f02402b19d4c2543736bd6500f5e1c3452ea67ebebf6c2fd5e74dfbf8f3af926af71ea486e2607c27f658f373f61a9fc41f27d0fcc760ff046dd1d832ad8a8a63fec1024100c6d1c5d5f94298c5a437adeca9152dd3ccd6052655efd12c218a9863322fb0e41822cfcc1d5dae7a2a5d8246eaca24bfb1dff30f7713bd82a7c7bfef1e28d4a702400bdc61fa4f449b20254d3d3ee6f6e4fad53eb0f26e78cb97c485725474cc55f1fedc8cfa902b9e94653fe25662ac84858e139bbf9b3059e6e8566541d0381f84"; $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>";
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#16楼 得分:0回复于:2009-02-11 18:03:19
引用 15 楼 yctin 的回复:
PHP code$der_data = "3082025c02010002818100c6ef3b59990cc51c626fa734d6ed4bb976bb22aeabce3115380787142c259f3249f99e47f62ffa0b31fd34e07dcb58251221d8b8c56b0562ec27287faa847ba13dbb10e2659c37e151faef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7c7938c0328bce0984e6851e851d557b8b342120b5e4ef3eeccccb9adf02030100010281804c3b7cc8d6e797d94ab772a1c302e813c835ea12796fe84b334f5f2a11c8d0fa9a72777f280e368977b…
感谢大哥~~~太感谢了。。。
但是写程序经常就是这样的情况。。。解决一个问题,新的问题就接踵而至。。
我试图用得到的PEM格式的公钥进行加密
PHP code
$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的熟悉,您能给我一些建议么?万分万分感谢。。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#17楼 得分:0回复于:2009-02-11 18:06:55
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-----
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#18楼 得分:0回复于:2009-02-11 18:07:59
需要
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#19楼 得分:0回复于:2009-02-11 18:09:00
PHP code
$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>";
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#20楼 得分:0回复于:2009-02-11 18:10:28
跑到 Framework 分类了 o_o||
跟Framework有什么关系?
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#21楼 得分:0回复于:2009-02-11 18:15:05
我看了下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也试了。。已经病急乱投医了-_-!
PHP code
$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
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#22楼 得分:0回复于:2009-02-11 18:16:27
引用 18 楼 yctin 的回复:
需要
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----
好,我马上试试。。。
您是在哪看到这个贴的?为了解决这个问题我转了好几次版块。。转到过C++,您是在那看到的么?
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#23楼 得分:0回复于:2009-02-11 18:31:24
引用 17 楼 yctin 的回复:
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-----
PHP code
$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>";
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
Simonsen46用户头像
Simonsen46
等 级:
#24楼 得分:20回复于:2009-02-12 02:25:12
如需要阅读该回复,请登录或注册CSDN!
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#25楼 得分:0回复于:2009-02-12 09:24:50
先試一下PHP的openssl吧,下面能完整運行就可以了
PHP code
<?php $configargs = array( 'config' => 'C:\xampp\apache\bin\openssl.cnf', //valid openssl.cnf // '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(); }else{ 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>"; ?>
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#26楼 得分:0回复于:2009-02-12 09:26:40
$configargs 内的 'config' => 'C:\xampp\apache\bin\openssl.cnf'
安装了openseel就有个openssl.cnf
路踁换成自己的
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#27楼 得分:0回复于:2009-02-12 11:12:16
引用 25 楼 yctin 的回复:
先試一下PHP的openssl吧,下面能完整運行就可以了
PHP code<?php
$configargs = array(
'config' => 'C:\xampp\apache\bin\openssl.cnf', //valid openssl.cnf
// 'digest_alg' => 'md5',
// 'x509_extensions' => 'v3_ca',
// 'req_extensions' => 'v3_req',
// 'private_key_bits' => 1024,
// 'private_key_type' => OPENSSL_KEYTYPE_RSA,
// 'encrypt_key' => false,
);
$pla…
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()
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#28楼 得分:0回复于:2009-02-12 11:34:09
引用 24 楼 Simonsen46 的回复:
我从头到尾看了一遍,觉得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两种不同的语言进行加解密的示例。。
http://blog.chinaunix.net/u/31179/showart_330477.html
其中有两个函数我觉得比较关键,我在JAVA版问过,不过好像有研究过的朋友不多。。。
http://topic.csdn.net/u/20090210/18/88baf428-c37e-426c-8a9c-ac0a24711e21.html
Java code
/** * 从公钥数据取得公钥 * @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}; try { 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 rsaPubKey; }
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#29楼 得分:0回复于:2009-02-12 11:56:54
PHP4 ... 那时我还没玩过RSA =.=||
php6都快出来了,怎么还在用php4
openssl 的版本都不相同
版本相差太大...没法试
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#30楼 得分:0回复于:2009-02-12 12:00:00
另外...C++ 的openssl 都可以出 PEM 的
http://www.openssl.org/docs/crypto/pem.html#PEM_FUNCTION_ARGUMENTS
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#31楼 得分:0回复于:2009-02-12 13:49:33
引用 29 楼 yctin 的回复:
PHP4 ... 那时我还没玩过RSA =.=||
php6都快出来了,怎么还在用php4
openssl 的版本都不相同
版本相差太大...没法试
大哥,我重新装了一个PHP5。
PHP code
<?php $configargs = array( 'config' => 'C:\xampp\apache\bin\openssl.cnf', //valid openssl.cnf // '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(); }else{ 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";
Key
-----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
Key
-----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);是不能得到到有效格式的密钥的?
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#32楼 得分:0回复于:2009-02-12 14:23:09
-----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-----
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#33楼 得分:0回复于:2009-02-12 14:47:30
引用 32 楼 yctin 的回复:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDG7ztZmQzFHGJvpzTW7Uu5drsirqvOMRU4B4cULCWfMkn5nkf2
L/oLMf004H3LWCUSIdi4xWsFYuwnKH+qhHuhPbsQ4mWcN+FR+u8/MHmtv2XPOiGA
rtQLfDCjZNNBqUGLPap8eTjAMovOCYTmhR6FHVV7izQhILXk7z7szMua3wIDAQAB
AoGATDt8yNbnl9lKt3KhwwLoE8g16hJ5b+hLM09fKhHI0Pqacnd/KA42iXe8ijjE
u9mpSwuBWzz7x/KigFb6pUNjhDaFQCv1YKzBiQrkRDrm2ecBXBrBi2LMHe9mrxXm
C34xk/rDPENGvY39HxS4BP21O5xYm…
是我用C++生成的privateKey 和publicKey,我把他们都保存在MYSQL数据库里了。。
有一点我一直很奇怪。。。我一开始只贴了私钥,你怎么得到公钥的呢。。。如果公钥可以用私钥算出来。。那就没什么安全性可言了
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#34楼 得分:0回复于:2009-02-12 14:48:47
我想把公钥和私钥贴出来。。但是老提示“回复中存在非法字符”。。。
“有太长的字符存在,为了避免影响显示效果,请在其中加空格或者回车。避免影响显示效果!”
我加了空格回车也还是这个提示。。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#35楼 得分:0回复于:2009-02-12 15:06:33
我用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
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#36楼 得分:0回复于:2009-02-12 15:07:13
引用 34 楼 imdemon 的回复:
我想把公钥和私钥贴出来。。但是老提示“回复中存在非法字符”。。。
“有太长的字符存在,为了避免影响显示效果,请在其中加空格或者回车。避免影响显示效果!”
我加了空格回车也还是这个提示。。
公钥本来就是用私钥算出来的
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#37楼 得分:0回复于:2009-02-12 15:17:25
可是我只给出了私钥。。。按理说你是不能根据私钥算出公钥的呀。。。。
不然,只要知道私钥或者知道公钥,就可以计算出彼此,那谈何非对称加密?
是不是我有哪里搞错了-_-
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#38楼 得分:0回复于:2009-02-12 15:32:10
openssl rsa -in private.key -pubout -out public.key
载入private key檔,生成public key檔
那你说public.key 那里来的=.=
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#39楼 得分:0回复于:2009-02-12 15:45:17
刚看了openssl的源码
它是用
//生成RSA private key
RSA_generate_key_ex(rsa, num, bn, &cb)
//输出
PEM_write_bio_RSAPrivateKey
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#40楼 得分:0回复于:2009-02-12 15:58:51
引用 38 楼 yctin 的回复:
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++里我得到的公钥是这个。。
http://www.phpx.com/happy/thread-256024-1-1.html(CSDN不接受这么长的字符串,所以我发到另外一个PHP论坛里了)
大哥你看下是不是一样的?
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#41楼 得分:0回复于:2009-02-12 16:11:03
引用 39 楼 yctin 的回复:
刚看了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);
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#42楼 得分:0回复于:2009-02-12 16:23:54
汗~很久没玩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 ,加档头档尾
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#43楼 得分:0回复于:2009-02-12 16:25:05
C/C++ code
int PEM_write_bio(BIO *bp, const char *name, char *header, unsigned char *data, long len) { int nlen,n,i,j,outl; unsigned char *buf = NULL; EVP_ENCODE_CTX 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)) goto err; i=strlen(header); if (i > 0) { if ( (BIO_write(bp,header,i) != i) || (BIO_write(bp,"\n",1) != 1)) goto err; } buf = OPENSSL_malloc(PEM_BUFSIZE*8); if (buf == NULL) { reason=ERR_R_MALLOC_FAILURE; goto err; } i=j=0; 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)) goto err; i+=outl; len-=n; j+=n; } EVP_EncodeFinal(&ctx,buf,&outl); if ((outl > 0) && (BIO_write(bp,(char *)buf,outl) != outl)) goto err; 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)) goto err; return(i+outl); err: if (buf) { OPENSSL_cleanse(buf, PEM_BUFSIZE*8); OPENSSL_free(buf); } PEMerr(PEM_F_PEM_WRITE_BIO,reason); return(0); }
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#44楼 得分:0回复于:2009-02-12 16:35:19
引用 42 楼 yctin 的回复:
汗~很久没玩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没转换成有效的密钥的缘故。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#45楼 得分:0回复于:2009-02-12 16:40:18
上面的代码纠正一个小错误。。
PHP code
$privkey = openssl_pkey_get_private($pemPriKey); //得到私钥 $pubkey = openssl_pkey_get_public($pub);//同样的方法从数据库得到公钥
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
phpBoy005用户头像
phpBoy005
(PHPBOY)
等 级:
#46楼 得分:0回复于:2009-02-12 16:48:50
漂过....
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#47楼 得分:0回复于:2009-02-12 17:16:56
你那个当然不行...
我上面不就给过你 DER to PEM 的代码吗?
我用你贴出来的key都成功了
看完openssl 的源码后
我基本上100%确定可以做到
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#48楼 得分:0回复于:2009-02-12 17:24:24
下班了~
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#49楼 得分:0回复于:2009-02-12 17:46:03
引用 47 楼 yctin 的回复:
你那个当然不行...
我上面不就给过你 DER to PEM 的代码吗?
我用你贴出来的key都成功了
看完openssl 的源码后
我基本上100%确定可以做到
我把我的代码和KEY都给出来,您抽个空看看好不?
PHP code
$db = mysql_connect("localhost", "root"); mysql_select_db("mysql",$db); $result = mysql_query("SELECT * FROM test WHERE username= 'g'",$db); $prikey = "3082025c02010002818100c6ef3b59990cc51c626fa734d6ed4bb976bb22aeabce3115380787142c259f3249f99e47f62ffa0b31fd34e07dcb58251221d8b8c56b0562ec27287faa847ba13dbb10e2659c37e151faef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7c7938c0328bce0984e6851e851d557b8b342120b5e4ef3eeccccb9adf02030100010281804c3b7cc8d6e797d94ab772a1c302e813c835ea12796fe84b334f5f2a11c8d0fa9a72777f280e368977bc8a38c4bbd9a94b0b815b3cfbc7f2a28056faa54363843685402bf560acc1890ae4443ae6d9e7015c1ac18b62cc1def66af15e60b7e3193fac33c4346bd8dfd1f14b804fdb53b9c589983b408256026ec7f59d3241881024100fb7140c45d0292f35e9fac33ccee509225f28f158a5ede971d01f3b4d8ffcea1e0adb5e110eb3a95fc5fed5f6edb8f6d11036d31de7d145545e13af51b159561024100ca8a54b3c7ed110f6864e440f43d9448ccc40f5051853c35e3f4f1fae8a627e1303c949d4c578b3b1fad891fcd83d1fda17d85cb23bc21a89069053a6fb2d83f02402b19d4c2543736bd6500f5e1c3452ea67ebebf6c2fd5e74dfbf8f3af926af71ea486e2607c27f658f373f61a9fc41f27d0fcc760ff046dd1d832ad8a8a63fec1024100c6d1c5d5f94298c5a437adeca9152dd3ccd6052655efd12c218a9863322fb0e41822cfcc1d5dae7a2a5d8246eaca24bfb1dff30f7713bd82a7c7bfef1e28d4a702400bdc61fa4f449b20254d3d3ee6f6e4fad53eb0f26e78cb97c485725474cc55f1fedc8cfa902b9e94653fe25662ac84858e139bbf9b3059e6e8566541d0381f84"; $pubkey = "30818902818100c6ef3b59990cc51c626fa734d6ed4bb976bb22aeabce3115380787142c259f3249f99e47f62ffa0b31fd34e07dcb58251221d8b8c56b0562ec27287faa847ba13dbb10e2659c37e151faef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7c7938c0328bce0984e6851e851d557b8b342120b5e4ef3eeccccb9adf0203010001"; $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";
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#50楼 得分:0回复于:2009-02-12 18:09:00
那是因为你的public key 是错的
PHP code
$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比正常的短...
闪人~明天再会
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#51楼 得分:0回复于:2009-02-13 11:58:49
引用 50 楼 yctin 的回复:
那是因为你的public key 是错的
PHP code$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比正常的短...
闪人~明天再会
我用C++写的测试程序,大哥你有没有OPENSSL的libeay32.lib?没有的话我找个地方传一下.
事实上,我给出的pubkey和prikey是对应的。。下面的程序成功的用公钥加密,用私钥解密。
应该能说明我给的密钥是没问题的吧?
C/C++ code
#include "stdafx.h" #include <openssl/rsa.h> #include <openssl/err.h> #include <openssl/sha.h> #include <openssl/x509.h> #include <windows.h> //2个帮助函数 int Bin2ASCII(unsigned char *pIn, long lSize, char *pOut) { for (long i=0; i<lSize; i++) sprintf(&(pOut[i*2]),"%02x", pIn[i]); return lSize * 2; } int ASCII2Bin(unsigned char *pIn, long lSize, unsigned char **ppOut) { char szBuf[3]; szBuf[2] = NULL; lSize/=2; for (long l=0; l<lSize; l++) { szBuf[0] = pIn[l*2]; szBuf[1] = pIn[(l*2)+1]; (*ppOut)[l] = (unsigned char)strtoul(szBuf, NULL, 16); } return lSize; } int main(int argc, char* argv[]) { unsigned char input[16] = "ABCD"; //私钥 unsigned char PriAscii[2048] = {"3082025c02010002818100c6ef3b59990cc51c626fa734d6ed4bb976bb22aeabce3115380787142c259f3249f99e47f62ffa0b31fd34e07dcb58251221d8b8c56b0562ec27287faa847ba13dbb10e2659c37e151faef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7c7938c0328bce0984e6851e851d557b8b342120b5e4ef3eeccccb9adf02030100010281804c3b7cc8d6e797d94ab772a1c302e813c835ea12796fe84b334f5f2a11c8d0fa9a72777f280e368977bc8a38c4bbd9a94b0b815b3cfbc7f2a28056faa54363843685402bf560acc1890ae4443ae6d9e7015c1ac18b62cc1def66af15e60b7e3193fac33c4346bd8dfd1f14b804fdb53b9c589983b408256026ec7f59d3241881024100fb7140c45d0292f35e9fac33ccee509225f28f158a5ede971d01f3b4d8ffcea1e0adb5e110eb3a95fc5fed5f6edb8f6d11036d31de7d145545e13af51b159561024100ca8a54b3c7ed110f6864e440f43d9448ccc40f5051853c35e3f4f1fae8a627e1303c949d4c578b3b1fad891fcd83d1fda17d85cb23bc21a89069053a6fb2d83f02402b19d4c2543736bd6500f5e1c3452ea67ebebf6c2fd5e74dfbf8f3af926af71ea486e2607c27f658f373f61a9fc41f27d0fcc760ff046dd1d832ad8a8a63fec1024100c6d1c5d5f94298c5a437adeca9152dd3ccd6052655efd12c218a9863322fb0e41822cfcc1d5dae7a2a5d8246eaca24bfb1dff30f7713bd82a7c7bfef1e28d4a702400bdc61fa4f449b20254d3d3ee6f6e4fad53eb0f26e78cb97c485725474cc55f1fedc8cfa902b9e94653fe25662ac84858e139bbf9b3059e6e8566541d0381f84"}; unsigned char PriKey[1024] = {0}; unsigned char* pPriKey = PriKey; //公钥 unsigned char PubAscii[2048] = {"30818902818100c6ef3b59990cc51c626fa734d6ed4bb976bb22aeabce3115380787142c259f3249f99e47f62ffa0b31fd34e07dcb58251221d8b8c56b0562ec27287faa847ba13dbb10e2659c37e151faef3f3079adbf65cf3a2180aed40b7c30a364d341a9418b3daa7c7938c0328bce0984e6851e851d557b8b342120b5e4ef3eeccccb9adf0203010001"}; unsigned char PubKey[1024] = {0}; unsigned char* pPubKey = PubKey; unsigned char encoded[1024] = {0}; unsigned char decoded[1024] = {0}; RSA* pRsa = NULL; //密钥ASCII2BIN 应该是得到DER编码的密钥 ASCII2Bin(&PriAscii[0], 1216, &pPriKey); //长度直接给常数,算好了的。 ASCII2Bin(&PubAscii[0], 280, &pPubKey); pRsa = RSA_new(); //用公钥加密 pRsa = d2i_RSAPublicKey(NULL, (const unsigned char **)&pPubKey, 140); RSA_public_encrypt(5, input, encoded, pRsa, RSA_PKCS1_PADDING); //用私钥解密 pRsa = d2i_RSAPrivateKey(NULL, (const unsigned char **)&pPriKey, 608); RSA_private_decrypt(128, encoded, decoded, pRsa, RSA_PKCS1_PADDING); //调试可以看到input encoded decoded 成功的实现了加解密 return 0; }
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
yctin用户头像
yctin
(ycTIN.com)
等 级:
2
#52楼 得分:0回复于:2009-02-13 14:18:42
今天比较忙,没空看
你可以自己下载openssl 的源码
跟踪一下 apps\rsa.c
看看他是怎样做转换private key 成public key的
也可以直接抄它的做法
现在基本上就是你的public key 不相同的问题
其它都OK
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
imdemon用户头像
imdemon
(魔殇)
等 级:
#53楼 得分:0回复于:2009-02-23 14:13:44
结贴了。。。多谢yctin大哥的一路指导。
最后,我还是用写PHP扩展的方式来解决这个项目,虽然并不完美。。。、
我也试过了直接用C++写PEM格式的密钥PEM_write_bio_RSAPublickKey ,但在PHP下还是用不了...我只能归结于我对于PKI这套玩意理解不深刻了。
还是将问题引导我所能驾驭的方向来解决。。。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
joyjjjz用户头像
joyjjjz
(Robin)
等 级:
#54楼 得分:0回复于:2009-10-26 11:36:33
学习,感谢各位精彩讨论
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
收录下 一段关于php加解密 的帖子
最新推荐文章于 2025-05-13 01:42:18 发布