RSA加密解密(无数据大小限制,php、go、java互通实现)
发布人:shili8
发布时间:2024-11-16 21:11
阅读次数:0
**RSA 加密解密**
RSA 是一种公钥密码法,广泛应用于网络安全领域。它使用一对加密和解密的密钥:一个公开的公钥(用于加密),一个私有的秘钥(用于解密)。在本文中,我们将实现 RSA 加密解密功能,并提供 PHP、Go 和 Java代码示例。
### RSA 算法原理RSA 算法基于大数因子分解困难这一数学概念。具体来说,RSA 使用两个大素数 p 和 q 来生成公钥和私钥。
1.选择两个大素数 p 和 q。
2. 计算 n = p * q,这是公钥的值。
3. 计算 φ(n) = (p-1)*(q-1),其中 φ 是欧拉函数。
4.选择一个整数 e,使得1 < e < φ(n)且 gcd(e,φ(n))=1。e 是公钥的指数。
5. 计算 d,满足 d*e ≡1 (mod φ(n))。d 是私钥的值。
### RSA 加密解密实现#### PHP 实现
php0) {
if ($exponent %2 ==1) {
$result = ($result * $base) % $modulus;
}
$base = ($base * $base) % $modulus;
$exponent = (int)($exponent /2);
}
return $result;
}
//生成 RSA 公钥和私钥function generate_rsa_keys() {
//选择两个大素数 p 和 q $p =61;
$q =53;
// 计算 n 和 φ(n)
$n = $p * $q;
$phi_n = ($p -1) * ($q -1);
//选择公钥 e $e =17;
// 计算私钥 d $d = powmod($e, -1, $phi_n);
return array(array($n, $e), array($n, $d));
}
// 测试 RSA 加密解密功能$keys = generate_rsa_keys();
$data = "Hello, World!";
echo "原始数据:$data
";
$encrypted_data = rsa_encrypt($data, $keys[0]);
echo "加密后数据:$encrypted_data
";
$decrypted_data = rsa_decrypt($encrypted_data, $keys[1]);
echo "解密后数据:$decrypted_data
";
?>
#### Go 实现
gopackage mainimport (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"fmt"
)
func generateRSAKeys() (publicKey, privateKey *rsa.PrivateKey) {
privateKey, _ := rsa.GenerateKey(rand.Reader,2048)
publicKey = &privateKey.PublicKey return}
func encrypt(data []byte, publicKey *rsa.PublicKey) []byte {
block, _ := x509.MarshalPKIX509PublicKey(publicKey)
pubInterface, _ := x509.ParsePKIX509PublicKey(block)
pub := pubInterface.(*x509.PKIXPublicKey)
encryptedData, _ := rsa.EncryptOAEP(rand.Reader, pub, data, nil, nil)
return encryptedData}
func decrypt(encryptedData []byte, privateKey *rsa.PrivateKey) []byte {
decryptedData, _ := rsa.DecryptOAEP(rand.Reader, &privateKey, encryptedData, nil, nil)
return decryptedData}
func main() {
publicKey, privateKey := generateRSAKeys()
data := "Hello, World!"
fmt.Println("原始数据:", data)
encryptedData := encrypt([]byte(data), &publicKey.PublicKey)
fmt.Println("加密后数据:", encryptedData)
decryptedData := decrypt(encryptedData, privateKey)
fmt.Println("解密后数据:", decryptedData)
}
#### Java 实现
javaimport javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class Main {
public static void main(String[] args) throws Exception {
//生成 RSA 公钥和私钥 KeyPair keyPair = generateRSAKeys();
String data = "Hello, World!";
// 加密数据 byte[] encryptedData = encrypt(data.getBytes(), keyPair.getPublic());
System.out.println("原始数据:" + data);
System.out.println("加密后数据:" + Base64.getEncoder().encodeToString(encryptedData));
// 解密数据 byte[] decryptedData = decrypt(encryptedData, keyPair.getPrivate());
System.out.println("解密后数据:" + new String(decryptedData));
}
public static KeyPair generateRSAKeys() throws Exception {
//选择两个大素数 p 和 q int p =61;
int q =53;
// 计算 n 和 φ(n)
long n = p * q;
long phi_n = (p -1) * (q -1);
//选择公钥 e int e =17;
// 计算私钥 d long d = modInverse(e, phi_n);
//生成 RSA 公钥和私钥 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(getBytes(n, e));
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(getBytes(n, d));
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
return new KeyPair(publicKey, privateKey);
}
public static byte[] getBytes(long n, long e) {
byte[] bytes = new byte[4];
for (int i =0; i < 4; i++) {
bytes[i] = (byte) ((n >> (8 * i)) &0xFF);
}
return bytes;
}
public static byte[] encrypt(byte[] data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] encryptedData, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(encryptedData);
}
}
以上是 RSA 加密解密的 PHP、Go 和 Java代码示例。这些代码实现了 RSA 公钥密码法,能够加密和解密数据。

