IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> AS2协议详解(二) -> 正文阅读

[网络协议]AS2协议详解(二)

上一篇中主要讲解了加密的理论知识,这篇来上代码。

签名和验签

通过信息摘要算法和非对称加密,可以实现信息的防伪造,防篡改,通过我们的私钥来签名消息,接收方就能通过我们的公钥来校验该消息是否是我们发送的。

/**
 * 获取证书库
 */
public static KeyStore getKeyStore(InputStream keyStoreInputStream, String keyStorePassword, String keyStoreType) throws Exception {
    return getKeyStore(keyStoreInputStream, keyStorePassword, keyStoreType);
}

public static KeyStore getKeyStore(InputStream keyStoreInputStream, String keyStorePassword, String keyStoreType, String provider) throws Exception {
    KeyStore keyStore;
    if (StringUtils.isNotBlank(provider)) {
        keyStore = KeyStore.getInstance(keyStoreType, provider);
    } else {
        keyStore = KeyStore.getInstance(keyStoreType);
    }
    keyStore.load(keyStoreInputStream, keyStorePassword.toCharArray());
    IoUtil.close(keyStoreInputStream);
    return keyStore;
}

/**
 * 从证书库中获取公钥
 */
public static PublicKey getPublicKeyFromKeyStore(KeyStore keyStore, String alias) throws Exception {
    Certificate certificate = keyStore.getCertificate(alias);
    return certificate.getPublicKey();
}

/**
 * 从证书库获取私钥
 */
public static PrivateKey getPrivateKeyFromKeyStore(KeyStore keyStore, String alias, String password) throws Exception {
    return (PrivateKey) keyStore.getKey(alias, password.toCharArray());
}

/**
 * 签名
 */
public static byte[] sign(byte[] message, PrivateKey privateKey, String algorithm) throws Exception {
    Signature signature;
    signature = Signature.getInstance(algorithm);
    signature.initSign(privateKey);
    signature.update(message);
    return signature.sign();
}

/**
 * 验签
 */
public static boolean verify(byte[] message, byte[] signMessage, PublicKey publicKey, String algorithm) throws Exception {
    Signature signature;
    boolean verifyResult;
    signature = Signature.getInstance(algorithm);
    signature.initVerify(publicKey);
    signature.update(message);
    verifyResult = signature.verify(signMessage);
    return verifyResult;
}

然后写个单元测试来验证下

@Test
public void testVerify() throws Exception {
    FileInputStream fis = new FileInputStream(new File("d:/keys/testkeystore.keystore"));
    //获取证书库
    KeyStore keyStore = getKeyStore(fis, "mypassword", "JKS");
    //获取私钥
    PrivateKey privateKey = getPrivateKeyFromKeyStore(keyStore, "mykeystore", "mypassword");
    //摘要算法用SHA1,非对称加密算法用RSA进行签名
    byte[] signMessage = sign(CONTENT.getBytes(), privateKey, "SHA1withRSA");
    //获取公钥
    PublicKey publicKey = getPublicKeyFromKeyStore(keyStore, "mykeystore");
    //进行验签
    boolean verify = verify(CONTENT.getBytes(), signMessage, publicKey, "SHA1withRSA");
    System.out.println(verify);
}

加密和解密

/**
 * 使用私钥加密
 */
public static byte[] encodeByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {
    // 对数据加密,加密算法由创建秘钥时指定,也可以自己指定,一般用RSA
    Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    return cipher.doFinal(data);
}

/**
 * 使用公钥解密
 */
public static byte[] decodeByPublicKey(byte[] data, PublicKey publicKey)
        throws Exception {
    // 对数据加密
    Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
    cipher.init(Cipher.DECRYPT_MODE, publicKey);
    return cipher.doFinal(data);
}

/**
 * 公钥加密
 */
public static byte[] encodeByPublicKey(byte[] data, PublicKey publicKey)
        throws Exception {
    // 对数据加密
    Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    return cipher.doFinal(data);
}

/**
 * 私钥解密
 */
public static byte[] decodeByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {
    // 对数据加密
    Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    return cipher.doFinal(data);
}

单元测试

public static String CONTENT = "寥落古行宫,宫花寂寞红。白头宫女在,闲坐说玄宗";
@Test
public void testDecode() throws Exception {
    FileInputStream fis = new FileInputStream(new File("d:/keys/testkeystore.keystore"));
    KeyStore keyStore = getKeyStore(fis, "mypassword", "JKS");
    PrivateKey privateKey = getPrivateKeyFromKeyStore(keyStore, "mykeystore", "mypassword");
    PublicKey publicKey = getPublicKeyFromKeyStore(keyStore, "mykeystore");
    //加密
    byte[] encode = encodeByPrivateKey(CONTENT.getBytes(), privateKey);
    //解密
    byte[] message = decodeByPublicKey(encode, publicKey);
    System.out.println(new String(message));
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:12:53  更:2022-05-14 10:14:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 6:21:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码