Длина зашифрованного значения с использованием Google KMS API в C # отличается от длины зашифрованного текста, сгенерированного непосредственно из API в почтальоне - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь зашифровать текст в C # с помощью Google KeyManagementService. Я не могу расшифровать шифр, сгенерированный KeyManagementServiceClient.Encrypt методом KeyManagementServiceClient.Decrypt. Расшифровка дает мне:

Grpc.Core.RpcException: Status(StatusCode=InvalidArgument, Detail="Decryption failed: the ciphertext is invalid.")

Я пытался использовать Google Try this API link, чтобы получить шифр, и длина шифра, сгенерированного Google API, и результат C # отличаются.

Ex: обычный текст: text

шифр из C #:

TaRQSJ2KXrdmJJT6MmlD8RrcxzPJEa1jwAXWJ1puXg6nbl80aBcSLQBqSYOONfXhpZx8SyxCdB6mqTgr8uLJoAjva+Q4kN/p0+9RL2Sp2mHq4wjmZQ==

шифр от API:

TaRQSJ2KXv9ntnS7IszL077KNPtGJnqF9pSNiWANsq8gD0whezUSKwBqSYOOKKMifiWrfPDnHL5xETHPPlms0ztjkqa5hjdtkHwpzByLzi68A40

Кто-нибудь решал проблему?

Вот мой пример кода

 KeyManagementServiceClient keyManagementServiceClient =KeyManagementServiceClient.Create(channel);
  byte[] plaintext=Encoding.ASCII.GetBytes("test");
  EncryptRequest request = new EncryptRequest
   {
       CryptoKeyPathName = new CryptoKeyPathName("test-project", "global", "test-key", "encryption-key"),
        Plaintext = ByteString.CopyFrom(plaintext),
   };
   EncryptResponse response =keyManagementServiceClient.Encrypt(request);
   var cipher = 
   Convert.ToBase64String(response.Ciphertext.ToByteArray());

 //Decrypt
  ByteString ciphertext = ByteString.CopyFrom(Encoding.ASCII.GetBytes(cipher));

  DecryptRequest req = new DecryptRequest
        {
            CryptoKeyName = new CryptoKeyName("test-project", "global", "test-key", "encryption-key"),
            Ciphertext = ciphertext,
        };
        // Make the request
        DecryptResponse res = keyManagementServiceClient.Decrypt(req);

1 Ответ

5 голосов
/ 29 марта 2019

Вы зашифровали base64 результаты шифрования, но не расшифровали base64, прежде чем пытаться расшифровать его.

В строке

ByteString ciphertext = ByteString.CopyFrom(Encoding.ASCII.GetBytes(cipher));

Вместо этого он должен выглядеть примерно так:

ByteString ciphertext = ByteString.FromBase64(cipher);

(Обратите также внимание, что класс ByteString имеет встроенные методы для перехода в / из Base64, если это именно то, что вы хотите сделать.)

...