我发现这在 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我仍然找不到任何解决方案。
有高手帮忙吗?