请写一个非对称加密工具 示例包括完整的通信流程

非对称加密工具通常用于保护数据的机密性和身份验证。下面是一个简化的示例,展示了完整的通信流程,包括密钥生成、加密、解密和数字签名验证:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
import java.security.Signature;
import java.util.Base64;

public class AsymmetricEncryptionTool {
    private static final String ALGORITHM = "RSA";

    // 生成密钥对
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
        keyPairGenerator.initialize(2048); // 设置密钥长度
        return keyPairGenerator.generateKeyPair();
    }

    // 使用公钥进行加密
    public static byte[] encrypt(byte[] data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }

    // 使用私钥进行解密
    public static byte[] decrypt(byte[] encryptedData, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(encryptedData);
    }

    // 使用私钥进行签名
    public static byte[] sign(byte[] data, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data);
        return signature.sign();
    }

    // 使用公钥进行验证签名
    public static boolean verify(byte[] data, byte[] signatureBytes, PublicKey publicKey) throws Exception {
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initVerify(publicKey);
        signature.update(data);
        return signature.verify(signatureBytes);
    }

    public static void main(String[] args) {
        try {
            // 发送方生成密钥对
            KeyPair senderKeyPair = generateKeyPair();

            // 接收方生成密钥对
            KeyPair receiverKeyPair = generateKeyPair();

            // 要加密的原始数据
            String originalData = "Hello, World!";
            byte[] originalBytes = originalData.getBytes();

            // 发送方使用接收方的公钥进行加密
            byte[] encryptedBytes = encrypt(originalBytes, receiverKeyPair.getPublic());

            // 发送方使用自己的私钥进行签名
            byte[] signatureBytes = sign(originalBytes, senderKeyPair.getPrivate());

            // 将字节数组转换为Base64字符串
            String encryptedString = Base64.getEncoder().encodeToString(encryptedBytes);
            String signatureString = Base64.getEncoder().encodeToString(signatureBytes);

            // 接收方将Base64字符串转换为字节数组
            byte[] encryptedBytesReceived = Base64.getDecoder().decode(encryptedString);
            byte[] signatureBytesReceived = Base64.getDecoder().decode(signatureString);

            // 接收方使用自己的私钥进行解密
            byte[] decryptedBytes = decrypt(encryptedBytesReceived, receiverKeyPair.getPrivate());

            // 接收方使用发送方的公钥验证签名
            boolean isValidSignature = verify(originalBytes, signatureBytesReceived, senderKeyPair.getPublic());

            // 输出结果
            System.out.println("原始数据: " + originalData);
            System.out.println("加密后的数据: " + encryptedString);
            System.out.println("解密后的数据: " + new String(decryptedBytes));
            System.out.println("签名是否有效: " + isValidSignature);
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
}


   以上示例代码在加密和签名结果的传输中使用了Base64编码和解码,以确保数据能够正确地转换为字符串并进行传输。发送方将加密后的数据和签名转换成Base64字符串,接收方将Base64字符串重新转换回字节数组进行解密和签名验证。

请注意,在实际应用中,还需要考虑网络传输中可能发生的数据丢失、篡改和重放攻击等情况。为了保护数据的完整性和安全性,可能需要使用额外的协议层或数据包装技术,如HTTPS、数字证书、消息认证码(MAC)等。
 

在这个示例中,我们有两个角色:发送方和接收方。每个角色都生成了自己的密钥对,包括公钥和私钥。

发送方使用接收方的公钥对原始数据进行加密,并使用自己的私钥对原始数据进行签名。然后,发送方将加密后的数据和签名一起发送给接收方。

接收方使用自己的私钥对加密后的数据进行解密,并使用发送方的公钥验证签名。

最后,我们打印出原始数据、加密后的数据、解密后的数据以及签名的验证结果。

请注意,这只是一个简化的示例,用于说明非对称加密在通信中的基本流程。在实际应用中,可能需要考虑更复杂的情况,如密钥交换、密钥管理和保护等。此外,还需要注意密钥的安全性和算法的选择。

你可能感兴趣的:(android,java,开发语言)