C# X509证书公钥填充

C# X509证书公钥填充,c#,java,rsa,padding,x509certificate,C#,Java,Rsa,Padding,X509certificate,我正在将一些Java代码移植到C#,但似乎Java和C#之间的公钥填充不一致 以下是我的Java代码: package Encryption; import java.security.cert.X509Certificate; import java.security.interfaces.RSAPublicKey; import java.io.ByteArrayInputStream; import java.security.cert.CertificateException; impo

我正在将一些Java代码移植到C#,但似乎Java和C#之间的公钥填充不一致

以下是我的Java代码:

package Encryption;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPublicKey;
import java.io.ByteArrayInputStream;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import javax.xml.bind.DatatypeConverter;
/**
 *
 * @author Cameron
 */
public class Encryptiontest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        String publicKey = "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";
        ByteArrayInputStream bytearrayinputstream = new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(publicKey));
        X509Certificate x509certificate;
        try
        {
            x509certificate = (X509Certificate)CertificateFactory.getInstance("X.509").generateCertificate(bytearrayinputstream);
            RSAPublicKey key = (RSAPublicKey)x509certificate.getPublicKey();
            System.out.println(DatatypeConverter.printBase64Binary(key.getEncoded()));
        }
        catch (CertificateException certificateexception)
        {
        }
    }

}
当我打印RSAPublicKey的base64表示时,我得到的是:

2.B+文中给出了一个新的概念。B+文中给出了一个新的概念。B+文中的一个2+文文中的2+文中给出了一个2+文中的2+文中的2+6+6+6+6+6+6+文中给出了一个新的概念,一个新的一个新的概念是一个新的概念,一个新的一个新的概念,一个新的概念,一个新的一个新的一个新的概念,一个新的一个新的概念,新的概念,新的一个新的一个新的概念,新的概念,新的概念,新的知识,新的概念,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,L9AJCZWJC/BQLHL8ELDYSR/KA006PSInW8yWtd4IFVKJ1Moa41gCUZL81voQIDAQAB

但是,使用相同的base64公钥的C#的结果是不同的。这是我的C#代码:

C#输出:

2.B+TJXXXB+6+6+6+6+6+8+8+QD+QD+6+6+8+QD+一个JJXXXB+一个GGGXXB+一个G8+一个关于一个新的一个新的一个新的中国的一个新的一个新的中国的一个新的中国的一个新的中国的一个新的中国的一个新的中国的一个新的中国的城市的一个新的知识知识,一个新的中国的一个新的中国的一个新的中国的一个中国的中国的一个中国的一个新的一个新的一个中国的一个中国的一个中国的一个新的一个中国的中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个006PSINW8YWTD4IFVKJ1MOA41GCUZL81voQIDAQAB


为什么两者相似,但填充方式不同?如何使C#输出看起来像Java输出?

Java输出是ASN.1 SubjectPublicKeyInfo的DER编码,如RFC中所指定。C#输出是ASN.1 RSAPublicKey的DER编码,这在许多地方都是特定的

是一个易于使用的在线ASN.1解码器,我觉得很方便。您可以将base64直接粘贴到表单中并对其进行解码

我并不是一个真正的.NET专家,但是我想如果不是完全相同的话,通过使用这个类,您可能会更接近。你可以。X509Certificate2类包含您可以访问的属性。该对象似乎有一个EncodedKeyValue,遵循这个看似无穷无尽的链可以获得原始数据。换句话说,类似于:

X509Certificate2 x509certificate2 = new X509Certificate2(data);
byte[] rsaPublicKey = x509certificate2.PublicKey.EncodedKeyValue.RawData;

应该有用。但是我还没有测试它。

这里是另一种获得公钥Base64表示的方法:

string base64 = Convert.ToBase64String(x509certificate.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks);

有关详细信息,请参见

它看起来像是
PublicKey.EncodedKeyValue.RawData
与从
GetPublicKey()
返回的字节数组相同。还有其他想法吗?@CameronTinker:我想知道为什么我认为会有所不同?我会尝试一些实验。没问题@GregS。我实际上能够成功地移植我的Java代码。上面的代码只是一个片段。我正在使用
X509Certificate
生成一个RSA公钥,用于加密一些数据。我使用
x509certificate.PublicKey.Key
作为输入参数,用于传递到
rsoaepkeychangeformter
进行密钥交换。我改为使用X509Certificate2,因为公钥仅在该类上可用。谢谢你让我走上正轨!
string base64 = Convert.ToBase64String(x509certificate.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks);