使用现有DER/PEM密钥在Javascript中进行RSA加密

使用现有DER/PEM密钥在Javascript中进行RSA加密,javascript,android,ios,encryption,rsa,Javascript,Android,Ios,Encryption,Rsa,我的第一篇文章 我正在尝试使用现有公钥对JavaScript中的数据进行非对称加密(在用户的浏览器中),我曾使用该公钥成功加密本机iOS和Android应用程序中的数据 我是这样创建密钥的: openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650 openssl x509 -in public_key.der -out nopass_p

我的第一篇文章

我正在尝试使用现有公钥对JavaScript中的数据进行非对称加密(在用户的浏览器中),我曾使用该公钥成功加密本机iOS和Android应用程序中的数据

我是这样创建密钥的:

openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
openssl x509 -in public_key.der -out nopass_public_with_cert.pem -inform DER -outform PEM
openssl x509 -pubkey -in nopass_public_with_cert.pem > public.pem
(感谢)

当我使用这些精彩的JavaScipt示例时:

  • 当我粘贴PEM格式的密钥并加密一个短字符串时,我会得到Base64中看似合法的密文,但它不会解密(我得到一个空白字符串)。解密代码与来自Android/iPhone的Base64密文完美结合

    这些教程中的PEM公钥由以下内容生成:

    openssl genrsa -out rsa.pem 1024 
    openssl rsa -in rsa.pem -pubout
    
    我通过以下方式将现有的DER公钥转换为PEM:

    openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
    
    openssl x509 -in public_key.der -out nopass_public_with_cert.pem -inform DER -outform PEM
    openssl x509 -pubkey -in nopass_public_with_cert.pem > public.pem
    
    我认为问题在于密钥和文件的格式/类型。或者误解了为什么会涉及证书/我使用上述openssl命令实际创建了什么。(什么是PKCS?)

    我的问题是:如何使用现有密钥在Javascript中加密,或者如何将这些文件转换为Javascript库可用的格式

    如果这有助于解释我所做的工作,以下是Android中成功的加密:

    import java.security.(...);
    
    import javax.crypto.Cipher;
    
    String publickeybase64 = go_get_file_bytes_as_base64("public_key.der");
    byte[]decode = Base64.decode(publickeybase64, Base64.DEFAULT);
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");
    Certificate certificate = certificateFactory.generateCertificate(new ByteArrayInputStream(decode));
    PublicKey publicKey = certificate.getPublicKey();
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    String plaintext = "hello world";
    String encryptedstring = new String(Base64.encode(cipher.doFinal(plaintext.getBytes()),Base64.NO_WRAP));
    

    谢谢大家

    在理解公钥的组成和使用的JavaScript库时,似乎有点不匹配


    X5.09证书是包含公钥的DER结构。它还包含很多其他数据,包括持有人、发行人、密钥,当然还有发行人的签名

    公钥通常也被编码为(PKCS#1)DER编码数据,但它仅由模和公共指数(对于RSA)组成

    PEM只是一个ASCII装甲,里面有DER


    现在,您的Android软件似乎使用证书进行加密。没关系,底层密码实现只是检索公钥并用它进行加密。但是,JavaScript代码只接受公钥,而不是证书。因此,您需要某种库来从证书检索公钥



    当然,最大的问题是如何确保JavaScript可以信任公钥。这可以在iOS和Android上解决,方法是在应用程序中包含一个受信任的(更高级别的CA)证书,并用它验证证书或公钥。对于JavaScript来说,这通常是不可能的,因为代码使用与公钥相同的不受信任的通道进行分发。因此,从技术上解决这个问题可能不会给您带来真正的安全。

    嗨,马丁。谢谢你的回复!您提到仅从现有证书检索公钥。是否有任何openssl专家可以从现有的DER文件中提取公钥?这是什么命令?我已经尝试过了,但是结果被弄糟了(我确实处在一个陌生的领域)。好的方面是,我同意JavaScript公钥容易受到MITM攻击,任何一个用户都可能受到这种攻击,但其目的是对服务器上的数据进行加密存储。充其量只是一种缓解,但这种方式比明文安全得多。再次感谢你的帮助!似乎从问题中的证书检索公钥。也请注意答案。这个链接中的Q+A不接受公钥(正如我所拥有的那样,DER),也不提供我所需要的格式(PEM),但非常感谢。我会问另一个更具体的问题。干杯没问题,有时我希望我能接管键盘和屏幕,帮助解决问题,但我想这真的超出了所谓的目的:)