我们正在使用 GCP 的 KMS 功能进行密钥管理。我们有一个 C# 代理,它将从密钥环中获取最新的公钥,加密一些数据并将其发送到后端服务,该服务将使用非对称解密和密钥环/密钥对其进行解密。
我很难让 C# 生成与 GCP KMS 一起使用的加密有效负载,可能某处的填充设置不正确?KMS 只是响应“解密失败”。
我已经尝试过两者System.Security.Cryptography
但BouncyCastle.NetCore
无济于事。每次都是同样的错误。
KMS 密钥创建如下:
gcloud kms keys create OUR_KEY --purpose=asymmetric-encryption --location=global --keyring=OUR_KEYRING --default-algorithm=rsa-decrypt-oaep-2048-sha256
然后我获取公钥:
gcloud alpha kms keys versions get-public-key 1 --location=global --keyring=OUR_KEYRING --key=OUR_KEY
C# 看起来像这样:
var pemReader = new PemReader(File.OpenText(args[0]));
var keys = (RsaKeyParameters)pemReader.ReadObject();
var digest = new Sha256Digest();
var eng = new OaepEncoding(new RsaEngine(), digest, digest, null);
eng.Init(true, keys);
var plainTextBytes = File.ReadAllBytes(args[1]);
var destinationPath = Path.Combine(Path.GetDirectoryName(args[1]), $"{Path.GetFileNameWithoutExtension(args[1])}.enc{Path.GetExtension(args[1])}");
int length = plainTextBytes.Length;
int blockSize = eng.GetInputBlockSize();
var cipherTextBytes = new List<byte>();
for (int chunkPosition = 0;
chunkPosition < length;
chunkPosition += blockSize)
{
int chunkSize = Math.Min(blockSize, length - chunkPosition);
cipherTextBytes.AddRange(eng.ProcessBlock(
plainTextBytes, chunkPosition, chunkSize
));
}
File.WriteAllBytes(destinationPath, cipherTextBytes.ToArray());
然后尝试解密文件(这是它失败的地方):
gcloud kms asymmetric-decrypt --plaintext-file=output.dec.txt --ciphertext-file=input.enc.txt --keyring=OUR_KEYRING --key=OUR_KEY --location=global --version=1
我们期望得到解密的文件,但只是得到错误Decryption Failed。