将PHP生成的公钥转换为Java公钥 - java

我是Android新手,正在基于客户端服务器的应用程序上工作。在这里,我需要使用RSA算法进行加密/解密。

该方案是:
1.服务器必须创建一个私钥/公钥对(PHP)并将公钥发送给客户端(Android应用程序)
2.客户端应使用该公钥加密数据并发送到服务器
3.现在服务器必须使用私钥解密。

在PHP中,我使用了“ PhpSecLib”来创建密钥对。

这是编码:

Server.php:

<?PHP
include 'Crypt/RSA.php';
$rsa = new Crypt_RSA();
extract($rsa->createKey(1024));
echo $publickey;
?>

生成的公钥:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLz4yAo1FTOLc6nijBCTv5iVnW
F6MxCeM5 + RxY + 29AXcpMWhlM9oES3ESIfWw6OzrrENDyqwY + kVzCj2bWYnEAyJXs
WOpvqT2XSCPplwZOnQQGm + DnAYJXEeOfgU5DI63fwdiGv4M2ph1VMMe6684sBZu1
HhJHuhsX2eibBR0 / lQIDAQAB

现在,在Java中,我成功接收了此公钥并将其存储在String中。

编码:

protected String doInBackground(Void... params) 
{
    try
    {
    URL url=new URL("http://10.0.2.2/Samples/Server.php");
    URLConnection con=url.openConnection();
    con.setDoOutput(true);
    BufferedReader ip=new BufferedReader(new InputStreamReader(con.getInputStream()));
    String tmp,res="";

    while((tmp=ip.readLine())!=null)
    {
        res+=tmp;

    }

    return res; //res contains the public key


    }
    catch(Exception e)
    {
        return new String("Exception : "+e.getMessage());
    }

}

我在Java中使用Bouncy城​​堡提供程序(bcprov-jdk15on-151)。

现在,我不知道如何将该字符串转换为RSA公钥。

请提出一些代码片段?如果代码需要改进和更正,请对其进行更正。

谢谢...

参考方案

假设您正确下载了密钥,则可以使用base 64 encoding中的密钥生成带有以下代码的java.security.PublicKey

import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;

public class ParseRsaPublicKey {

    public static void main(String[] args) throws Exception {
        String yourKeyB64 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLz4yAo1FTOLc6nijBCTv5iVnW\n"+
                "F6MxCeM5+RxY+29AXcpMWhlM9oES3ESIfWw6OzrrENDyqwY+kVzCj2bWYnEAyJXs\n"+
                "WOpvqT2XSCPplwZOnQQGm+DnAYJXEeOfgU5DI63fwdiGv4M2ph1VMMe6684sBZu1\n"+
                "HhJHuhsX2eibBR0/lQIDAQAB";
        // create the key factory
        KeyFactory kFactory = KeyFactory.getInstance("RSA", new BouncyCastleProvider());
        // decode base64 of your key
        byte yourKey[] =  Base64.decode(yourKeyB64);
        // generate the public key
        X509EncodedKeySpec spec =  new X509EncodedKeySpec(yourKey);
        PublicKey publicKey = (PublicKey) kFactory.generatePublic(spec);
        // now you can for example cipher some data with your key
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] cipherData = cipher.doFinal("someData".getBytes());
        System.out.println(new String(cipherData));
    }

}

希望这可以帮助,

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Scanner读取文件的奇怪行为 - java

因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

Java:我可以在Hashmaps中使用数组吗? - java

我可以在Hashmaps中使用数组吗?如果是这样,则声明这种哈希图的确切语法是什么?谢谢 参考方案 数组也是对象。甚至像int[]这样的原始数组。Map<String,String[]> map = new HashMap<String,String[]>();