Ruby 通过 RSA 加密解密

第一步:生成公钥和私钥

require 'openssl'
rsa_key = OpenSSL::PKey::RSA.new(2048)
public_key_string = rsa_key.public_key.to_pem
private_key_string = rsa_key.to_pem

public_key:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApa7oX/2FZoyz1fAtcDGN
ufzUa9x2T9QlvpfFmub5yLsQtUm+2lkHnKLMOA4bCiBAob5uFvAN7LYL2Wo6IP71
HL+JbIFZ8dvPwCVDbLepp0sbQO8uL5blDAL0kGrwSVV6tnhOl9cmSMJJIxublrHV
rin0td/MRF90jFc+KpLYsWjdrV5BFNoTT8O7LOxIYq+0aQs4VGXi4yf6gRG2xWKu
tPVt9oHL1YOPTY7XpAgcwPQwPWzgZPgXKbulbFuhd72tQl+Fo8hpxZdhxnIfTsck
ncDJ7Qv2XugTfmdXKd+BHqbYFgzIV8PXguCKWETZph85boLZBIm7+VQqKHONIUgk
twIDAQAB
-----END PUBLIC KEY-----

private_key

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEApa7oX/2FZoyz1fAtcDGNufzUa9x2T9QlvpfFmub5yLsQtUm+
2lkHnKLMOA4bCiBAob5uFvAN7LYL2Wo6IP71HL+JbIFZ8dvPwCVDbLepp0sbQO8u
L5blDAL0kGrwSVV6tnhOl9cmSMJJIxublrHVrin0td/MRF90jFc+KpLYsWjdrV5B
FNoTT8O7LOxIYq+0aQs4VGXi4yf6gRG2xWKutPVt9oHL1YOPTY7XpAgcwPQwPWzg
ZPgXKbulbFuhd72tQl+Fo8hpxZdhxnIfTsckncDJ7Qv2XugTfmdXKd+BHqbYFgzI
V8PXguCKWETZph85boLZBIm7+VQqKHONIUgktwIDAQABAoIBADuW6+bSVO9sPaX9
iyol+HZjM7dThI3znFuvVJgA6OfEOB8r1ePMT4uLle23TQxYS0ahKhE/55Iya5KX
vS5u5JOhY/jNkR8G0vKltFleuTr9LWEuZSsil2C5k2J5w9BsWQVVwdakwBU9I3bo
EA6kCVlpp6TeSCZzOoTbP/Wp+RvdKljF4IH8+bIc1x/6pSdM+HcMHBL00YkAY3Tk
9ZMD65S2aJgUFze2rjwMI7lVWCZVwHIUeBVQKSBTLdIFfcKlKqFGm7PVrQ2Tt7DU
U76y6n8z9iKzBZAZlvRbDXg0aOsq8OM2vSLTCVfN/bOtQIbwf7UyH38UFQFiE77/
k4+D61ECgYEA1VrGI8qduEBFS0AfYNb9QZDCOEwkhk6qB4tJUhDUHtms8Et6sw6X
XExfIv2FxhA/RLrfmCMJeVuYLQNStVYYrkVQ7da+2lrffQ8otK6n7VCdf928rq7g
Qdw7MZmjZDxYruxmzO6cDHmyYr37dksFS9XirHMAVraii//n+ZOAm/8CgYEAxszR
ull6pVYrkRL6h35LIeCb8VkEdbP6cQSzdaM3uSzQubkYjABd1h15hKbCGN/BvPOX
kM9ha9RTbhnpF3x8LZvv5ow82J2uAda09v1+9nYGF37ewl60BC4leueiDQ205Hz3
NMsKv99n8IUyC8h66z4ioy1ZsalF8UDp0gNoV0kCgYBj2igBeEJ4iRvlLA2DdRry
JJ3BW2F8ujQ5c6bNEbM0/QtDKxAx3RJZ0CR2a9C/8bqqoAslWMCGW6fM6VE8LR8/
8JD/vxFzgDQ4g2+5oERXfPM5dL1pw86RBFFv1UfzEYsv0tQJ9WJzNEGYlPGrW1EP
PPrpWqk97BwHCa230KDQYQKBgQCx+QU9LgP1ZnpkSzhL+o1qi7kvzMCIWxK3AT1j
8DXfqjZGPmWyWFWpbQOv9NZJDHBWJ0EmG/IcZZ43MC0ToJdPAY44uI10Y103Oi8R
+wkhvbFgcW0dV0kTgPh+2kWiKAYsk4+ADNHXyjo0Aho2oEkitqKtsNjeiysZe0KY
iAJuOQKBgQCkUHgudSRAC8J3CQQvUqccgdNUuXaKrdklyT32gHsFPapzS9Mg9tnh
hWHJcVhoJkAIWPFFEa5FFs6Ix1j8e9jprD5cNyfRUAAju8dKbP35IMqGIgpMRmeC
IjWt1f6Q6nAI1VP2j9CooaVYu7wy9mSaUzJSl9SBa0mCtYtY0tSUIA==
-----END RSA PRIVATE KEY-----

第二步:加密解密信息

require 'openssl'

# > 用户端保留私钥
private_key = OpenSSL::PKey::RSA.new(private_key_string
# > 服务商保留公钥
public_key = OpenSSL::PKey::RSA.new(public_key_string)

# 场景1: 
# 用户发送加密信息
x = private_key.private_encrypt('a')
# 服务商解密信息
public_key.public_decrypt(x) # => 'a'

# 场景2:
# 服务商加密信息
y = public_key.public_encrypt('b')
# 用户解密信息
private_key.private_decrypt(y) # => 'b'
2021-10-20
0