签名算法
## 签名算法
#### 第一步:
将`游戏API指引`中的对应方法的`API参数`以`JSON`格式用DES秘钥`des_key`进行DES-ECB加密生成密文,即`params`参数。
示例:
>i 【params】: des.encrypt({“cagent”:”xxxxxx”,”loginname”:”xxxxxx”,”method”:”lg”,”actype”:0,”password”:” xxxxxxxx”,”oddtype”:”A”,”cur”:”CNY”}, "des_key")
#### 第二步:
将生成的DES密文用MD5秘钥`md5_key`进行MD5加密生成32位小写加密串,即`key`参数。
示例:
>i 【key】: md5(“params” + md5_key)=47bce5c74f589f4867dbd57e9ca9f808
---
#### php DES加密代码参考:
```php
$params = base64_encode(openssl_encrypt(json_encode($data), 'des-ecb', $desKey, OPENSSL_RAW_DATA));
```
#### java DES加密代码参考:
```java
public static String encrypt(String str, String key) throws Exception {
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
return Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes())).replaceAll("\\s*", "");
}
```
#### C# DES加密代码参考:
```C#
/// <summary>
/// DES加密方法
/// </summary>
/// <param name="plainText">要加密的字符串</param>
/// <param name="encryptKey">密鈅的位數</param>
/// <returns></returns>
public string DesEncrypt(string plainText, string encryptKey)
{
// 把密钥转换成字节数组
byte[] keyBytes = ASCIIEncoding.ASCII.GetBytes(encryptKey);
// 把纯文本转换成字节数组
byte[] plainBytes = ASCIIEncoding.ASCII.GetBytes(plainText);
// 声明DES对象
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
provider.Key = keyBytes;
provider.IV = keyBytes;
provider.Mode = CipherMode.ECB; // 注意修改模式
// 开辟一块内存流
MemoryStream msEncrypt = new MemoryStream();
ICryptoTransform transform = provider.CreateEncryptor(keyBytes, keyBytes);
CryptoStreamMode mode = CryptoStreamMode.Write;
// 把内存流对象包装成加密流对象
CryptoStream cryptoStream = new CryptoStream(msEncrypt, transform, mode);
cryptoStream.Write(plainBytes, 0, plainBytes.Length);
cryptoStream.FlushFinalBlock();
// 从内存流中读取加密的消息
byte[] encryptedplainBytes = new byte[msEncrypt.Length];
msEncrypt.Position = 0;
msEncrypt.Read(encryptedplainBytes, 0, encryptedplainBytes.Length);
// 将加密的消息编码为base64字符串
string encryptedMessage = Convert.ToBase64String(encryptedplainBytes);
return encryptedMessage;
}
```
#### python DES加密代码参考:
```python
def pkcs7padding(text):
"""
明文使用PKCS7填充
最终调用AES加密方法时,传入的是一个byte数组,要求是16的整数倍,因此需要对明文进行处理
:param text: 待加密内容(明文)
:return:
"""
bs = AES.block_size # 16
length = len(text)
bytes_length = len(bytes(text, encoding='utf-8'))
# tips:utf-8编码时,英文占1个byte,而中文占3个byte
padding_size = length if (bytes_length == length) else bytes_length
padding = bs - padding_size % bs
# tips:chr(padding)看与其它语言的约定,有的会使用'\0'
padding_text = chr(padding) * padding
return text + padding_text
def aes_encode(key, content):
"""
AES加密
key,iv使用同一个
模式ecb
填充pkcs7
:param key: 密钥
:param content: 加密内容
:return:
"""
key_bytes = bytes(key, encoding='utf-8')
cipher = AES.new(key_bytes, AES.MODE_ECB)
# 处理明文
content_padding = pkcs7padding(content)
# 加密
aes_encode_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
# 重新编码
result = str(base64.b64encode(aes_encode_bytes), encoding='utf-8')
return result
```