当前位置:实例文章 » JAVA Web实例» [文章]RSA加密解密(无数据大小限制,php、go、java互通实现)

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

其他信息

其他资源

Top