结合java和c使用rsa#

hjzp0vay  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(249)

我目前正在做一个项目,我想使用rsa进行身份验证。但是,当我将java用于我的服务器,将c用于我的客户机时,在java中创建或更好地初始化java.security中的publickey类时,我遇到了很多问题。我已经为这两种语言使用了多种解决方案,而且大多数都是自己工作的。
这就是我的基本c#rsa客户机:

public static void NewKeyPair()
    {
        var csp = new RSACryptoServiceProvider(1024);

        //how to get the private key
        var privKey = csp.ExportParameters(true);
        //and the public key ...
        var pubKey = csp.ExportParameters(false);

        _ = privKey.Modulus;
        _ = pubKey.Modulus;
    }

    public void Encrypt(string text, string publicKey)
    {
        RSAParameters para = new RSAParameters();
        para.Modulus = Convert.FromBase64String(publicKey);

        //conversion for the private key is no black magic either ... omitted

        //we have a public key ... let's get a new csp and load that key
        var csp = new RSACryptoServiceProvider();
        csp.ImportParameters(para);

        //for encryption, always handle bytes...
        var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(text);

        //apply pkcs#1.5 padding and encrypt our data 
        var bytesCypherText = csp.Encrypt(bytesPlainTextData, false);

        //we might want a string representation of our cypher text... base64 will do
        var cypherText = Convert.ToBase64String(bytesCypherText);

    }

    public static void Decrypt(string encryptedText, RSAParameters para)
    {

        var bytesCypherText = Convert.FromBase64String(encryptedText);

        //we want to decrypt, therefore we need a csp and load our private key
        var csp = new RSACryptoServiceProvider();
        csp.ImportParameters(para);

        //decrypt and strip pkcs#1.5 padding
        var bytesPlainTextData = csp.Decrypt(bytesCypherText, false);

        //get our original plainText back...
        var plainTextData = System.Text.Encoding.Unicode.GetString(bytesPlainTextData);
    }

如果我没记错的话,这基本上是微软的文档。
同时这是我的java代码:

public static KeyPair gen() throws NoSuchAlgorithmException {
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(1024);
    return keyGen.generateKeyPair();
}

public static String encrypt(String message, PublicKey pk) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pk);
    return Base64.getEncoder().encodeToString(cipher.doFinal(message.getBytes()));
}

public static String decrypt(String encryptedText, PrivateKey pk) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, pk);
    return new String(cipher.doFinal(Base64.getDecoder().decode(encryptedText)));
}

所以为了连接这些,我先用c#导出密钥

Convert.ToBase64String(csp.ExportSubjectPublicKeyInfo()

在将其写入控制台之后,我将其粘贴到java中的以下代码片段中:

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(""));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);

// Encrypting
String encrypted = encrypt("Hello", pubKey);

之后,我用c#再次解密来检查每一个链接(之前大部分都失败了) keyFactory.generatePublic(keySpec); )
尽管这可能是由字节系统引起的,比如c#使用无符号和java有符号,但是我不知道如何解决这个问题。有人知道怎么解决这个问题吗?c类:

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题