2011-10-29 59 views
0

我正在开发两部分的解决方案:第一部分是将基于Android的SMS加密。而第二部分则关注发行和交换公钥/私钥。RSA之间的PHP服务器端和Java(Android)客户端。

一切都很好,直到我面临这个问题: 如果您使用的是java密码术类,它提供了生成密钥对象的mod和密钥的exp。尽管我从生成密钥的服务器获得的所有内容都是预先计算的公钥。所以,无法从服务器获取mod或exp,我在哪里使用phpseclib。

在做了一些研究之后:我带了三个选项,我需要决定哪一个最好。

1)如果有一种方法可以从phpseclib访问mod & exp,那么问题就会以较少的时间解决,对吧?

2)替换java中的本地加密类,与第三方一样,将采取公钥的弹性城堡是一个参数。

3)将服务器端语言改为JSP。那么,我可以在两边使用相同的类。

哪一种解决方案最容易采用..?

非常感谢。

+0

服务器发送的“密钥”格式是什么? - 所需的密码参数将在其中编码,只需要提取。 – JimmyB

+0

我认为这是默认的CRYPT_RSA_PUBLIC_FORMAT_PKCS1,在phpseclib文档中说过。 从服务器输出等: '----- BEGIN PUBLIC KEY ----- MIGfAoGXCsLnyw64KfYTd4hjhq6sS + 4AhnwgnAm/N/jMEaXtFCMVDfkY48dg5nMcOxjRmuJSK4Qr xDIjCtRyNkBj6nVDjwDGVe4vF5 + s7dkI1lwlfOM2kl/zuuUveeYaT1pSehh2gs2j32deIR8o1zhI 0 + bCebB + YC + mGND5Ro0dgc6z8AFevSEO12Ww9GP1ZFlTuwRAIt0/e3ZrIQIDAQAB ----- END PUBLIC KEY -----' – adel

回答

0

好的,只是看看http://phpseclib.sourceforge.net/documentation/misc_crypt.html#misc_crypt_rsa_format

一个简单的方法是使用CRYPT_RSA_PRIVATE_FORMAT_XML,在android上做一些XML解析。

编辑:忘记:)

另一个格式 - CRYPT_RSA_PUBLIC_FORMAT_RAW - 被存储为一个阵列,两个索引 - 一个用于模量和一个用于指数。

的getpublickey()有一个可选的参数 - $类型 - 设置格式。

这样,您应该会收到一个由两个元素(模数和指数)组成的数组,然后您可以从服务器以任何方式将数据传输到客户端。

+0

谢谢,我知道我应该通过类型$ rsa-> setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_XML);' 我的代码看起来像这样'$ rsa = new Crypt_RSA(); $ array = $ rsa-> createKey(1204,60); $ rsa-> setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_XML); extract($ array); echo $ publickey;' 只是没有得到正确的东西,我得到了旧的格式。 – adel

+0

现在很清楚,只是得到RAW格式的工作,你应该在'createKey()'之前放置'setPublicKeyFomat(CRYPT_RSA_PUBLIC_FORMAT_RAW)'谢谢Hanno :) – adel

+0

很高兴我可以帮助:) – JimmyB

1

我回答了我自己的问题,以备将来参考给大家。

1)由phpseclib的作者联系,他告诉我

最新的SVN版本增加了以下支持: CRYPT_RSA_PRIVATE_FORMAT_XML CRYPT_RSA_PUBLIC_FORMAT_XML CRYPT_RSA_PRIVATE_FORMAT_PUTTY”

应该解决什么问题像我的。

2)对于我来说,通过从Java的RSA本地库生成公钥和私钥,然后将其存储到Web数据库服务器并使用codeigniter运行,我克服了上述情况(发生在上述响应之前)。您可以为自己制作一个简单的API。使用android(java)URLConnection并将URL传递给您想要存储的值,然后将其解析为另一端。

它可能看起来像这样: http://localhost/myApp/index.php/AndroidisTalking/registerKeys/VAR1/VAR2 注意VAR1,VAR2是生成的密钥。

希望它有帮助。并感谢Hanno Bender的大力帮助。