如何从亚马逊销售合作伙伴 api 解密亚马逊报告文档

问题描述

报告文档API 获取ReportDocument api

"response": {
              "payload": {
                "reportDocumentId": "0356cf79-b8b0-4226-b4b9-0ee058ea5760","url": "https://d34o8swod1owfl.cloudfront.net/SampleResult%2BKey%3DSample%2BINITVEC%3D58+fa+bf+a7+08+11+95+0f+c1+a8+c6+e0+d5+6f+ae+c8","encryptionDetails": {
                  "standard": "AES","initializationVector": "58 fa bf a7 08 11 95 0f c1 a8 c6 e0 d5 6f ae c8","key": "Sample"
                }
              }
            }

当我直接访问这个网址时 "url": "https://d34o8swod1owfl.cloudfront.net/SampleResult%2BKey%3DSample%2BINITVEC%3D58+fa+bf+a7+08+11+95+0f+c1+a8+c6+e0+d5+6f+ae+c8"自动下载文件,需要用AES解密吗? 初始化向量是用Base64编码的吗? 如何得到报告?

解决方法

通过 url 下载文件后(您只有 5 分钟的时间),您必须对其进行解密。因此,按字节(二进制)下载它并使用密码模式 CBC 使用 AES(最初称为 Rijndael)对其进行解密。 正如您所想,密钥和初始化向量是 base 64 编码的。她是 C# 中的一些示例代码:

GetReportDocumentResponse requestResult = ... //your request to getreportdocument here
byte[] rawData = new System.Net.WebClient().DownloadData(requestResult.payload.url);
byte[] key = Convert.FromBase64String(requestResult.payload.encryptionDetails.key);
byte[] iv = Convert.FromBase64String(requestResult.payload.encryptionDetails.initializationVector);

string documentText; // this will contain the decrypted document
using (var rijndaelManaged = new RijndaelManaged { Key = key,IV = iv,Mode = CipherMode.CBC })
using (var memoryStream = new MemoryStream(rawData))
using (var cryptoStream = new CryptoStream(memoryStream,rijndaelManaged.CreateDecryptor(key,iv),CryptoStreamMode.Read))
{
    documentText = new StreamReader(cryptoStream).ReadToEnd();
}
,

//这是我的工作代码
++++++++++++++++++++++++++++++

response3 = reportsApi.GetReportDocument("Give_your_ReportDocumentId");
            
byte[] rawData = new System.Net.WebClient().DownloadData(response3.Payload.Url);
byte[] key = Convert.FromBase64String(response3.Payload.EncryptionDetails.Key);
byte[] iv = Convert.FromBase64String(response3.Payload.EncryptionDetails.InitializationVector);

var reportData = ReportsApiTests.DecryptString(key,iv,rawData);
File.WriteAllText(report_type + ".txt",reportData);


public static string DecryptString(byte[] key,byte[] iv,byte[] cipherText)
{
    byte[] buffer = cipherText;

    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
        aes.IV = iv;
        ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key,aes.IV);

        using (MemoryStream memoryStream = new MemoryStream(buffer))
        {
            using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream,decryptor,CryptoStreamMode.Read))
            {
                using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }
    }
    
}