和不同语言的第三方对接不可避免的遇到语言不一致的问题,比如AES的加解密
此次案例中Go和Java都是使用的AES128加密算法AES/ECB/PKCS5Padding,但是直接使用 golang 中的 AES ECB来进行加解密是有问题的,在java 中进行了 SHA1PRNG 处理数据是结果是对应不上的,在java中解密的时候会一直提示秘钥是坏的导致验签失败
解决办法
重新编写golang的编码(下面是源码)
1.加密方法
func (r *XRsa) SignSHA1withRSA(data string) (string, error) {
// PrivateSign 生成私钥签名(SHA1withRSA)
hash := sha1.Sum([]byte(data)) // 使用 SHA1 哈希算法
encrypted, err := rsa.SignPKCS1v15(rand.Reader, r.PrivateKey, crypto.SHA1, hash[:])
if err != nil {
return "", err
}
signature := base64.StdEncoding.EncodeToString(encrypted)
return signature, nil
}
2.解密方法
func DecryptByHex(encryptedHex, key string) (string, error) {
keyBytes, err := base64.StdEncoding.DecodeString(key)
if err != nil {
return "", fmt.Errorf("无效的密钥,无法解码为 base64 字符串")
}
if len(keyBytes) != 16 { // AES-128的密钥长度应为16字节
return "", fmt.Errorf("密钥长度无效,应为 16 字节")
}
encryptedBytes, err := hex.DecodeString(encryptedHex)
if err != nil {
return "", fmt.Errorf("无效的十六进制字符串,无法解码为字节数组")
}
block, err := aes.NewCipher(keyBytes)
if err != nil {
return "", err
}
decryptedBytes := make([]byte, len(encryptedBytes))
for i := 0; i < len(encryptedBytes); i += aes.BlockSize {
block.Decrypt(decryptedBytes[i:i+aes.BlockSize], encryptedBytes[i:i+aes.BlockSize])
}
decryptedBytes = PKCS5Unpadding(decryptedBytes)
return string(decryptedBytes), nil
}
3.使用
4.PKSC5的封装
// PKCS5去填充
func PKCS5Unpadding(src []byte) []byte {
length := len(src)
unpadding := int(src[length-1])
return src[:(length - unpadding)]
}