如何在C#中实现给定私钥的椭圆曲线密码解密?

问题描述 投票:0回答:0

我发现这在 Java 中实现起来非常简单,如下所示:

package com.demo;

import org.bouncycastle.jce.interfaces.ECPrivateKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;

public class ECCDemo {
    public static final String base64PrivateKey = "MHECAQAwF...";

    public static final ECPrivateKey privateKey;

    static {
        Security.addProvider(new BouncyCastleProvider());
        try {
            privateKey = string2PrivateKey();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static ECPrivateKey string2PrivateKey() throws Exception{
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(base64PrivateKey));
        KeyFactory keyFactory = KeyFactory.getInstance("ECDH", "BC");
        return (ECPrivateKey) keyFactory.generatePrivate(keySpec);
    }

    public static byte[] privateDecrypt(byte[] content, PrivateKey privateKey) throws Exception{
        Cipher cipher = Cipher.getInstance("ECIES", "BC");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] bytes = cipher.doFinal(content);
        return bytes;
    }

    public static void main(String[] args) throws Exception{
        // cipher text
        String content = "BG5QIGEETItEZNxHO...";
        // ECIES decryption
        String plainText = new String(privateDecrypt(Base64.getDecoder().decode(content), privateKey));        
        System.out.println(plainText);
    }
}

私钥是用 Java

secp160r1
标准生成的

ECGenParameterSpec ecGenSpec = new ECGenParameterSpec("secp160r1");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");
keyPairGenerator.initialize(ecGenSpec, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("Public key: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
System.out.println("Private key: " + Base64.getEncoder().encodeToString((privateKey.getEncoded())));

但是我没能用

Bouncycastle
库在C#中实现,即使我咨询了ChatGPT我仍然找不到任何解决方案。 有高手帮忙吗?

c# cryptography elliptic-curve
© www.soinside.com 2019 - 2024. All rights reserved.