eos-crypto-java 使用指南
源码:https://github.com/yanjunli/eos-crypto-java
eos-crypto-java 目前可以支持 基于 ECC+AES 的加解密方式。
在本压缩包中,包含基于jdk1.5 打好的jar 包。
要求
jdk 1.5+
基于 EOS 公钥加密,私钥解密示例
String privateKey = "5KTZYCDdcfNrmEpcf97SJBCtToZjYHjHm8tqTWvzUbsUJgkxcfk";
EosPrivateKey eosPrivateKey = new EosPrivateKey(privateKey);
EosPublicKey eosPublicKey = eosPrivateKey.getPublicKey();
ECPrivateKey ecPrivateKey = eosPrivateKey.getECPrivateKey();
ECPublicKey ecPublicKey = eosPublicKey.getECPublicKey();
byte[] plaindata = "{\"age\": 1,\"12345\":\"24qqwazzxdtttdxkaskjewuizckczxnlsdosasda4!!!@#$$%^&&*(()(^#\"}".getBytes("utf8");
System.out.println("加密原文:" + new String(plaindata));
byte[] encryptdata = ECCUtil.publicEncrypt(plaindata,ecPublicKey);
System.out.println("加密后密文:" + HexUtils.toHex(encryptdata));
plaindata = ECCUtil.privateDecrypt(encryptdata,ecPrivateKey);
System.out.println("解密后原文: "+ new String(plaindata));
基于ECC+AES 双向验证 加解密示例
String senderPrivateKey = "5KTZYCDdcfNrmEpcf97SJBCtToZjYHjHm8tqTWvzUbsUJgkxcfk";
EosPrivateKey senderECPrivateKey = new EosPrivateKey(senderPrivateKey);
EosPublicKey senderECPublicKey = senderECPrivateKey.getPublicKey();
String senderPublicKey = senderECPublicKey.toString();
String receiverPrivateKey = "5JUrqxYcssR9LLVtWDeQcc9HCX4FEqBG7d9GW6t7mvmB1rUuZr9";
EosPrivateKey receiverECPrivateKey = new EosPrivateKey(receiverPrivateKey);
EosPublicKey receiverECPublicKey = receiverECPrivateKey.getPublicKey();
String receiverPublicKey = receiverECPublicKey.toString();
byte[] nonce = new byte[16];
MTRandom random=new MTRandom();
random.nextBytes(nonce);
byte[] params = "{\"test1\": 1,\"test2\":\"24qqwazzxdtttdxkaskjewuizckczxnlsdosasda4!!!@#$$%^&&*((){}(^#\"}".getBytes("utf8");
System.out.println("原始加密数据: " + new String(params,"utf8"));
byte[] encrypted = new byte[0];
try {
encrypted = CryptUtil.encrypt(senderECPrivateKey,receiverECPublicKey,nonce,params);
} catch (InvalidCipherTextException e) {
e.printStackTrace();
System.out.println(" do something!!!!");
}
System.out.println("加密后数据: " + new String(encrypted,"utf8"));
try {
byte[] plainText = CryptUtil.decrypt(receiverECPrivateKey,senderECPublicKey,nonce,encrypted);
System.out.println("解密后数据 : "+new String(plainText, "utf8"));
} catch (InvalidCipherTextException e) {
e.printStackTrace();
System.out.println(" do something!!!!");
}
基于数字信封的 加解密示例
String senderPrivateKey = "5KTZYCDdcfNrmEpcf97SJBCtToZjYHjHm8tqTWvzUbsUJgkxcfk";
EosPrivateKey senderECPrivateKey = new EosPrivateKey(senderPrivateKey);
EosPublicKey senderECPublicKey = senderECPrivateKey.getPublicKey();
String senderPublicKey = senderECPublicKey.toString();
String receiverPrivateKey = "5JUrqxYcssR9LLVtWDeQcc9HCX4FEqBG7d9GW6t7mvmB1rUuZr9";
EosPrivateKey receiverECPrivateKey = new EosPrivateKey(receiverPrivateKey);
EosPublicKey receiverECPublicKey = receiverECPrivateKey.getPublicKey();
byte[] nonce = new byte[16];
MTRandom random=new MTRandom();
random.nextBytes(nonce);
byte[] params = "{\"age\": 1,\"汉字\":\"为初始化向量,可以使用固定值,\",\"12345\":\"24qqwazzxdtttdxkaskjewuizckczxnlsdosasda4!!!@#$$%^&&*(()(^#\"}".getBytes("utf8");
System.out.println("加密前原始数据: " + new String(params,"utf8"));
byte[] encryptedData = null;
try {
encryptedData = CryptUtil.aesEncryptWithNOIV(nonce,params);
} catch (InvalidCipherTextException e) {
e.printStackTrace();
System.out.println(" do something!!!!");
}
System.out.println("加密后数据: " + HexUtils.toHex(encryptedData));
System.out.println("加密前对称密钥: " + HexUtils.toHex(nonce));
byte[] encryptedKey = null;
try {
encryptedKey = ECCUtil.publicEncrypt(nonce,receiverECPublicKey.getECPublicKey());
} catch (Exception e) {
e.printStackTrace();
System.out.println(" do something!!!!");
}
System.out.println("加密后对称密钥: " + HexUtils.toHex(encryptedKey));
ByteBuffer bytebuffer = ByteBuffer.allocate( 4 + encryptedKey.length + 4 +encryptedData.length);
bytebuffer.putInt(encryptedKey.length);
bytebuffer.put(encryptedKey);
bytebuffer.putInt(encryptedData.length);
bytebuffer.put(encryptedData);
String hexencode = HexUtils.toHex(bytebuffer.array());
System.out.println(" 将数字信封和密文组装后的报文 16进制格式:" + hexencode);
System.out.println("发送方数据加密完成,可以将数据发送出去 ");
byte[] hexdecode = HexUtils.toBytes(hexencode);
ByteBuffer receiveBuffer = ByteBuffer.wrap(hexdecode);
int receivedEncryptedKeyLength = receiveBuffer.getInt();
byte[] receivedEncryptKey = new byte[receivedEncryptedKeyLength];
receiveBuffer.get(receivedEncryptKey,0,receivedEncryptedKeyLength);
System.out.println(" 接收到的 加密后的对称密钥 :" + HexUtils.toHex(receivedEncryptKey));
int contextLength = receiveBuffer.getInt();
byte[] receivedEncryptContext = new byte[contextLength];
receiveBuffer.get(receivedEncryptContext,0,contextLength);
System.out.println(" 接收到的 密文:" + HexUtils.toHex(receivedEncryptContext));
byte[] receiveddecryptKey = null;
try {
receiveddecryptKey = ECCUtil.privateDecrypt(receivedEncryptKey,receiverECPrivateKey.getECPrivateKey());
} catch (Exception e) {
e.printStackTrace();
System.out.println(" do something!!!!");
}
System.out.println(" 解密后的对称密钥 :" + HexUtils.toHex(receiveddecryptKey));
try {
byte[] plainText = CryptUtil.aesDecryptWithNOIV(receiveddecryptKey,receivedEncryptContext);
System.out.println("解密后数据 : "+new String(plainText, "utf8"));
} catch (InvalidCipherTextException e) {
e.printStackTrace();
System.out.println(" do something!!!!");
}