自定义函数的Python到R的转换

2024-10-06 08:57:18 发布

您现在位置:Python中文网/ 问答频道 /正文

下面给出了两个python函数

import sys, os, base64, datetime, hashlib, hmac 
def sign(key, msg):
    return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()

def getSignatureKey(key, datestamp, regionName, serviceName):
    kDate = sign(('AWS4' + key).encode('utf-8'), datestamp)
    kRegion = sign(kDate, regionName)
    kService = sign(kRegion, serviceName)
    kSigning = sign(kService, 'aws4_request')
    return kSigning

我想把它们转换成R函数

这是我试过的

library(digest)
sign=function(key, msg)
{
  return (digest(hmac(key,enc2utf8(msg),"sha256", raw=F)))
}

getSignatureKey=function(key, datestamp, regionName, serviceName)
{
  kDate = sign(enc2utf8(paste0('AWS4' , key)), datestamp)
kRegion = sign(kDate, regionName)
kService = sign(kRegion, serviceName)
kSigning = sign(kService, 'aws4_request')
return (kSigning)
}

考虑到以下输入

key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
datestamp = '20120215'
regionName = 'us-east-1'
serviceName = 'iam'

下面给出了预期的输出(根据python函数)

kSecret  = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559'
kDate    = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'
kRegion  = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c'
kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'
kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'

很遗憾,我无法在R中生成上述值

我想了解R函数中的错误是什么

这里有更多的细节,以防您想了解这是从哪里来的(https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-other


Tags: key函数namereturnservicemsghmachashlib
1条回答
网友
1楼 · 发布于 2024-10-06 08:57:18

我能弄明白这一点

对于第一个函数,它不需要摘要,并保留参数raw=t

sign=function(key, msg)
{
  return (hmac(key,msg,"sha256", raw=T))
}

下面给出了第二个函数,其中添加了一行,用于将字节向量转换为字符串

getSignatureKey=function(key, date_stamp, regionName, serviceName)
{
  kDate = sign(paste0('AWS4' , key), date_stamp)
kRegion = sign(kDate, regionName)
kService = sign(kRegion, serviceName)
kSigning = sign(kService, 'aws4_request')

kSigning=paste(kSigning,collapse="")
return (kSigning)
}

出于某种原因,保留函数中的参数,hmac函数中的raw=F将函数2中后续的签名操作弄乱了。因此,保留raw=T并使用粘贴最终使其成为字符串

相关问题 更多 >