签名算法

## 签名算法 #### 第一步: 将`游戏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 ```