[英]iPhone SDK equivalent to C#'s BitConverter.GetBytes() and BitConverter.ToInt32()
[英]What's the equivalent of C#'s GetBytes() in Python?
我有
byte[] request = UTF8Encoding.UTF8.GetBytes(requestParams);
在我要转换为Python的C#AES加密类中。 谁能告诉我Python 2.5的等效工具(我在Google App Engine上使用它吗?
输入示例:
request_params: &r = p&playerid = 6263017(或查询字符串的组合)
dev_key: GK1FzK12iPYKE9Kt
dev_iv: E2I21NEwsC9RdSN2
dev_id: 12
Python功能:
def Encrypt(self, request_params, dev_key, dev_iv, dev_id):
data_bytes = request_params.encode("utf-8")
block_size = 16
mode = AES.MODE_CBC
assert len(dev_key) == block_size and len(dev_iv) == block_size
pad_char = '0'
pad_length = block_size - len(data_bytes) % block_size
padded_data_bytes = data_bytes + pad_length * pad_char
encrypted_bytes = dev_iv + AES.new(dev_key, mode, dev_iv).encrypt(padded_data_bytes)
base64_encrypted_string = base64.urlsafe_b64encode(str(encrypted_bytes))
request_uri = "http://api.blackoutrugby.com/?d=" + dev_id + "&er=" + base64_encrypted_string
#http://api.blackoutrugby.com/?d=19&er=RTJJNTFORXdzQzNSZFNObNerdsGhiNoeue6c3mzed4Ty1YE-gTlVJVXHz05uPT-8
# output from this Python code, it's incorrect
#http://api.blackoutrugby.com/?d=19&er=16t2waGI2h657pzebN53hPr4kEjOzgsOEZiycDwPXR4=
# correct output from C# code
return request_uri
C#类:
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Net;
using System.Xml;
using Newtonsoft.Json;
namespace BlackoutRugbyPOC.Controllers {
public class BlackoutRugbyAPI {
public static string Request(string requestParams, string devKey, string devIV, string devID) {
// Create an unencrypted request as an array of bytes
byte[] request = UTF8Encoding.UTF8.GetBytes(requestParams);
byte[] key = UTF8Encoding.UTF8.GetBytes(devKey);
byte[] iv = UTF8Encoding.UTF8.GetBytes(devIV);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.Key = key;
aes.IV = iv;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.Zeros;
// Get the transformer from the AES Encryptor
ICryptoTransform cTransform = aes.CreateEncryptor();
// Use the transformer to encrypt our request
byte[] result = cTransform.TransformFinalBlock(request, 0, request.Length);
aes.Clear();
// Encode to base64
string encryptedRequest = Convert.ToBase64String(result, 0, result.Length);
// Send request to API
string requestUri = "http://api.blackoutrugby.com/?d=" + devID + "&er=" + encryptedRequest;
string xmlResponse = getWebResponse(requestUri);
return XmlToJson(xmlResponse);
}
private static string getWebResponse(string url) {
string html = "";
WebRequest request = HttpWebRequest.Create(url);
WebResponse response = request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream())) {
html = reader.ReadToEnd();
}
return html;
}
public static string XmlToJson(string xml) {
if (string.IsNullOrEmpty(xml))
throw new ArgumentNullException("XML Input");
XmlDocument doc = new XmlDocument();
try {
doc.LoadXml(xml);
} catch {
throw new ArgumentNullException("Input could not be loaded into XML Document");
}
return JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.Indented);
}
}
}
谢谢,
丹尼斯
不知道从哪里获得以下代码
data_bytes = str.encode(request_params)
key_bytes = str.encode(dev_key)
iv_bytes = str.encode(dev_iv)
但您应该知道它等同于以下内容:
data_bytes = request_params.encode("ascii")
key_bytes = dev_key.encode("ascii")
iv_bytes = dev_iv.encode("ascii")
这意味着三个变量中任何一个的非ASCII字符都会导致错误(我希望您不只组成ASCII字符的AES密钥吗?)。
在Python 2.x中, str
对象(C#中的byte[]
)是字节,而unicode
对象(C#中的string
)是文本。 顺便说一下,这个令人困惑的事实在Python 3.x中已更改。
这意味着如果request_params
是Unicode对象,则应将其编码为UTF-8,如果它是str
对象,则应假定(或检查)它已被编码为UTF-8。 所以可能是这样的:
if isinstance(request_params, unicode):
data_bytes = request_params.encode("utf-8")
else:
request_params.decode("utf-8") # optional check whether it is correct UTF-8
data_bytes = request_params
至于密钥/ IV,它们将始终是二进制数据(例如AES-128为16字节),而不是文本。 因此他们没有字符编码。 删除这两行代码,并可能将其替换为
assert len(dev_key) == block_size and len(dev_iv) == block_size
buffer = file.read(bytes)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.