密码学数字签名Java代码
时间: 2024-11-06 08:13:20 浏览: 11
密码学数字签名是一种用于验证数据完整性和身份的技术,通常结合了公钥加密和哈希函数。在Java中,可以使用`java.security.Signature`类来实现数字签名。下面是一个简单的示例,展示了如何生成和验证一个RSA数字签名:
```java
import java.security.*;
import java.math.BigInteger;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
public class DigitalSignatureExample {
private static final String PUBLIC_KEY_FILE = "public_key.pem";
private static final String PRIVATE_KEY_FILE = "private_key.pem";
public static void main(String[] args) throws Exception {
// 加密密钥
FileInputStream publicKeyStream = new FileInputStream(PUBLIC_KEY_FILE);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(new X509KeyPairGenerator().generateKeyPair(new FileInputStream(PRIVATE_KEY_FILE)).getPublic());
// 原始数据
byte[] data = "Hello, World!".getBytes(StandardCharsets.UTF_8);
// 使用公钥对数据进行哈希并签名
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(publicKey);
signature.update(data);
byte[] signatureBytes = signature.sign();
// 显示原始数据和签名
System.out.println("Original Data: " + new String(data));
System.out.println("Signature: " + Arrays.toString(signatureBytes));
// 验证签名
signature.initVerify(publicKey);
signature.update(data);
try {
boolean isValid = signature.verify(signatureBytes);
if (isValid) {
System.out.println("Signature is valid.");
} else {
System.out.println("Signature verification failed.");
}
} catch (BadPaddingException e) {
System.out.println("Invalid padding during verification.");
}
publicKeyStream.close();
}
}
```
在这个例子中,我们首先加载公钥和私钥文件,然后使用公钥对数据进行签名。接着,我们验证这个签名是否有效。如果验证通过,说明数据未被篡改。
阅读全文