Java 密码学库
Java 密码学库
...
Java 中的密码学
- JCA、Bouncy Castle 与 Web3j:哈希、ECC 和 ECDSA
JCA、Bouncy Castle 与 Web3j
- Java 中的密码学基于 Java 密码学体系结构(JCA)
- 典型的 Java 风格:包含大量样板代码
- Bouncy Castle 是领先的 Java 密码学库
- Web3j——面向以太坊和 secp256k1 的简化库
- Web3j – https://github.com/web3j
- 密码学功能位于 web3j/crypto 中
Java 中的 ECDSA:安装密码学库
- 这个 Maven 依赖项会安装以下库:
- org.web3j.crypto——以太坊风格的 secp256k1 椭圆曲线密码学
- org.bouncycastle——Java 的 BouncyCastle 密码学提供程序
<dependency>
<groupId>org.web3j</groupId>
<artifactId>crypto</artifactId>
<version>3.3.1</version>
</dependency>
Java 中的 ECDSA:初始化应用程序
import org.bouncycastle.util.encoders.Hex;
import org.web3j.crypto.*;
import java.math.BigInteger;
Java 中的 ECDSA:生成或加载密钥
// Generate random private key
// BigInteger privKey = Keys.createEcKeyPair().getPrivateKey();
BigInteger privKey = new BigInteger(
"97ddae0f3a25b92268175400149d65d6887b9cefaf28ea2c078e05cdc15a3c0a", 16);
BigInteger pubKey = Sign.publicKeyFromPrivate(privKey);
ECKeyPair keyPair = new ECKeyPair(privKey, pubKey);
System.out.println("Private key: " + privKey.toString(16));
System.out.println("Public key: " + pubKey.toString(16));
System.out.println("Public key (compressed): " +
compressPubKey(pubKey));
Java 中的 ECDSA:为消息签名
String msg = "Message for signing";
byte[] msgHash = Hash.sha3(msg.getBytes());
Sign.SignatureData signature =
Sign.signMessage(msgHash, keyPair, false);
System.out.println("Msg: " + msg);
System.out.println("Msg hash: " + Hex.toHexString(msgHash));
System.out.printf(
"Signature: [v = %d, r = %s, s = %s]\n",
signature.getV() - 27,
Hex.toHexString(signature.getR()),
Hex.toHexString(signature.getS()));
Java 中的 ECDSA:验证签名
BigInteger pubKeyRecovered =
Sign.signedMessageToKey(msg.getBytes(), signature);
System.out.println("Recovered public key: " +
pubKeyRecovered.toString(16));
boolean validSig = pubKey.equals(pubKeyRecovered);
System.out.println("Signature valid? " + validSig);