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 公钥密码法,能够加密和解密数据。