2026-02-17 13:06:23 +08:00
package baseutils
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/des"
"crypto/md5"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"crypto/x509"
"encoding/binary"
"encoding/hex"
"encoding/pem"
"errors"
"fmt"
"hash/crc32"
"math/big"
"github.com/micro/go-micro/util/log"
)
const (
public_key_99 = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDf5W7uZQbl+XlrTxLDpIEhuE5U\njpmZ2DTiwDfjzSdunEorF1jFgqZ/bRKJXOVSXd5R0LktMri+eyyFgncpw1cdzBS1\ngYd7xjS8x/naOCXJeiWzQaZClQmDA8S1hOxXnsynyLlngvZdZQA57noHcsGV2+/E\nSIvfsLmljFwFjjqwTQIDAQAB\n-----END PUBLIC KEY-----\n"
public_key_189 = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7Czt3VSBlM6KjpJYBfVE\nR9G7t9XeRwHxvx/NFLCIuJqL3KoiEVwfVW2ZRyKcrYR8y92hC9ojyk6Xm/O8WVVK\n+Ly9ruBjSjWG7nG1DrPZIGGuJI2Uc9yXvg7vSBmoNo/JH6WwVGQPsWknOe/jnAzs\n4OuTRi0A5DeSJclENnVth6Xi9lke50M9eS1S3Xy9GPSEbLg5CGG/E9r04p/SvP4g\n9UcBYyj21EvpIrWei6QyC2b9wbJosc+r8opF5LzTab45NM2suvTNIPdJVXVjGaWo\n+ZN1tK9PRKHTIabJPmS3eYyIl56KR1o7IRd71iQGN/omcJKfjlCcF3x2Gyto0o+E\nWwIDAQAB\n-----END PUBLIC KEY-----\n"
public_key_190 = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA21WeytqtK3+fBi3AistJ\n4Zt9WIDaMadUSEPT+nmUYH8KtaWYZnl99fnAbs+hhcsf7ziE57KKfPW9VbMk2D5j\nKnOld18BcWIWb/obhGtJoTceA6J/cXKvEXkD1SMM0ZpadVK12rJlNgozV2hc3TsV\n0wteK9EYennlQot/pjIniAOSyUzeROmMvkzf53v3syzwuA3CQipdoAO3pNN86urk\ntiRb+HtQbKjeahHAEIws4XV4okSRGrf9DQeLzObxaFl6rpqxSBMl+HfZEL3rBvIW\ns9+dSb5Y56Kq32MMVfKkQXZ+awU+DyCyv7KbAyaDX/LCzWP7USTWsgcQsE+BoxMM\nSwIDAQAB\n-----END PUBLIC KEY-----\n"
public_key_133 = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvWpUR3ZA8MCyCdt3RxJo\nlrJ/trIZq5vJxM2WYfQi4UOnWrLDTquI9EcZ2NLg1XzslxN0i/gh7CAU35ewHM4m\nLyfKJPTYlJL5ncjBpBTQuOdg2BXfU6kR1dgHyvaCcIS76CWknBu5NpZ1xL5DVZdW\nW1xCIgkCNfalWVAD1dX6Z4Dr1Rzqx20D2Oufl7RSmXGffDUrLvMkSeD90JtWK6Ax\ndBi2b8CFPqn1/6heq4oU4nhcArDKxq/UUO5aaXHCIOcv5vpLeBI1850gZzTJl0En\n42nkeb8yVf/4xfpLEzxkKlZWqOXxdkcsWj/hjYgW5A5Yq8KkoyugVusLUEyG2uBZ\nBwIDAQAB\n-----END PUBLIC KEY-----"
public_key_133_hex = "BD6A54477640F0C0B209DB7747126896B27FB6B219AB9BC9C4CD9661F422E143A75AB2C34EAB88F44719D8D2E0D57CEC9713748BF821EC2014DF97B01CCE262F27CA24F4D89492F99DC8C1A414D0B8E760D815DF53A911D5D807CAF6827084BBE825A49C1BB9369675C4BE435597565B5C4222090235F6A5595003D5D5FA6780EBD51CEAC76D03D8EB9F97B45299719F7C352B2EF32449E0FDD09B562BA0317418B66FC0853EA9F5FFA85EAB8A14E2785C02B0CAC6AFD450EE5A6971C220E72FE6FA4B781235F39D206734C9974127E369E479BF3255FFF8C5FA4B133C642A5656A8E5F176472C5A3FE18D8816E40E58ABC2A4A32BA056EB0B504C86DAE05907"
public_key_135 = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXkUc/36zOQmBYQBthJa\nPW/t12x90bBCanPYpBgrKeptBfT16NmaTT0cPlzzyMs83fk1ZDyU04kniBsUTQTz\nEPEzB9GuY6EAonl6cUwNHipaDvd5/D1vfTwzlidr8n2m1m4mlqZVfv1LYZDHJolN\nNc5VnhR5abrASv67DjojWyx5WsapgY4UozpEaPj/ar6KVKdBgAQr8P04Qn9wtoG5\nQxoJnndGGNRV8U0fdRIVd9rmbDhToqqcTw+cIhpm9kpG1faLDVDyLH5PoNhASLL5\nF59LhkQqJyDI/ie8aMXGOE3MM2+XkU8niLkF5f6Yxbt1RIiw9rCUIbsnv/UY7w6S\nmQIDAQAB\n-----END PUBLIC KEY-----"
public_key_135_hex = "B5791473FDFACCE426058401B6125A3D6FEDD76C7DD1B0426A73D8A4182B29EA6D05F4F5E8D99A4D3D1C3E5CF3C8CB3CDDF935643C94D38927881B144D04F310F13307D1AE63A100A2797A714C0D1E2A5A0EF779FC3D6F7D3C3396276BF27DA6D66E2696A6557EFD4B6190C726894D35CE559E147969BAC04AFEBB0E3A235B2C795AC6A9818E14A33A4468F8FF6ABE8A54A74180042BF0FD38427F70B681B9431A099E774618D455F14D1F75121577DAE66C3853A2AA9C4F0F9C221A66F64A46D5F68B0D50F22C7E4FA0D84048B2F9179F4B86442A2720C8FE27BC68C5C6384DCC336F97914F2788B905E5FE98C5BB754488B0F6B09421BB27BFF518EF0E9299"
public_key_125_hex = "D8D2AE73FF601B93B1471B35870A1B59D7649EEA815CDD8CE5496BBD0C6CFE19C0E082F4E513B615C6030CCFCE3153E25AA00E8156D0311AF72ABBB9BBEC8B1D3751592234B1A621CA774E2EC50047A93FA0BC60DF0C10E8A65C3B29D13167EC217FC6A29034494870705CBF4AC929FBA0E1E656A8F8B50E779AD89BB4EEF6FF"
public_key_182_hex = "C8930AB6E688F68513682FA555E1A3C175867CDC4AAE1D054F75134D1553D9E4A1BBC846FBAEE947E1515363365185AEB39C9DD5B76BF8ADE21233E27728BC0ED8C465CCC7DBABC7EBE08B1FA23A89098D7730C31FBE375745A9AA717D7F3DE5FB8126B6D6B2B9EB1643346F00EBE3A2AA915A417B263E4026FEF4BFA91B81B035DE224857E87FB292FB9AFBAC45725D968068385963E3CDB0162C901D0921030515D1CA1E079129DD585969EF6CBABBE72E287D9A9F757FAE91543F5AADD96777BE49D1CEF58669250DB4B992C01AFE22AF5DDDB0147BD5C8B373F39381A1E914078050239D490B6FC02E68B61A81BCE0ED9710BC84481273E32ED89ACD5211"
)
// Rsa的publicKey -- 135
var publicKey = [ ] byte ( ` -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXkUc/36zOQmBYQBthJa
PW/t12x90bBCanPYpBgrKeptBfT16NmaTT0cPlzzyMs83fk1ZDyU04kniBsUTQTz
EPEzB9GuY6EAonl6cUwNHipaDvd5/D1vfTwzlidr8n2m1m4mlqZVfv1LYZDHJolN
Nc5VnhR5abrASv67DjojWyx5WsapgY4UozpEaPj/ar6KVKdBgAQr8P04Qn9wtoG5
QxoJnndGGNRV8U0fdRIVd9rmbDhToqqcTw+cIhpm9kpG1faLDVDyLH5PoNhASLL5
F59LhkQqJyDI/ie8aMXGOE3MM2+XkU8niLkF5f6Yxbt1RIiw9rCUIbsnv/UY7w6S
mQIDAQAB
-----END PUBLIC KEY----- ` )
var cdnRsaPubKey = [ ] byte ( ` -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/7f+16ihQn5yJ7YP6f92oiBQ1
1ETphNU6mK2OlBDxFF7dU3iQ4QRWGQsi5uUAZFXvxsEuQf2phfOPu8chPsuBDjBT
1LjXT/vHC0YAq9coICMir84UBgRmMSYb1e49RHIQgv6rdDQNc2RdwNAqKTuWK51H
5KZBAL11JN4A2dO1wQIDAQAB
-----END PUBLIC KEY----- ` )
// encAesKeyPublicKey 这个是用来加密EncryptUserInfo Key的rsa公钥
var encAesKeyPublicKey = [ ] byte ( ` -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDoqn5y8C1D0g8LVr/LSmCBiNJC
4TdPsHa+qWBuq/xEhv01MVzIoN5Vc8UZ0qLjDeWh462Ou2Ps6E6O1C+VSTBxtLrp
zBOxB/iAUKgw5we4G8kNijeVumVro/AovUeqUJRrMVkSBMbp/O1WZfiK7bQN0UxF
zpQe0j8HZ9hwGWnjSQIDAQAB
-----END PUBLIC KEY----- ` )
// AesEncryptKeyBytes Aes加密
func AesEncryptKeyBytes ( orig [ ] byte , key [ ] byte ) [ ] byte {
// 转成字节数组
// origData := []byte(orig)
// 分组秘钥
block , err := aes . NewCipher ( key )
if err != nil {
fmt . Println ( "AesEncryptKeyBytes - " , err . Error ( ) )
return [ ] byte { }
}
// 获取秘钥块的长度
blockSize := block . BlockSize ( )
// 补全码
orig = PKCS7Padding ( orig , blockSize )
// 加密模式
2026-02-26 10:44:13 +08:00
blockMode := cipher . NewCBCEncrypter ( block , key [ : blockSize ] )
2026-02-17 13:06:23 +08:00
// 创建数组
cryted := make ( [ ] byte , len ( orig ) )
// 加密
blockMode . CryptBlocks ( cryted , orig )
// return base64.StdEncoding.EncodeToString(cryted)
return cryted
}
// AesEncrypt Aes加密
func AesEncrypt ( orig [ ] byte , key [ ] byte ) [ ] byte {
// 转成字节数组
// origData := []byte(orig)
// if len(key) > 16 {
// key = key[:16]
// }
return AesEncryptKeyBytes ( orig , key )
}
// AesDecryptByteKey Aes CBC解密
func AesDecryptByteKey ( cryted [ ] byte , key [ ] byte ) ( [ ] byte , error ) {
if len ( cryted ) <= 0 || len ( key ) <= 0 {
return [ ] byte { } , errors . New ( "AesDecryptByteKey err: len(cryted) <= 0 || len(key) <= 0" )
}
// 分组秘钥
block , err := aes . NewCipher ( key )
if err != nil {
return [ ] byte { } , err
}
// 获取秘钥块的长度
blockSize := block . BlockSize ( )
// 加密模式
blockMode := cipher . NewCBCDecrypter ( block , key [ : blockSize ] )
// 创建数组
orig := make ( [ ] byte , len ( cryted ) )
// 解密
blockMode . CryptBlocks ( orig , cryted )
// 去补全码
return PKCS7UnPadding ( orig )
}
// AesDecrypt aes CBC解密
func AesDecrypt ( cryted [ ] byte , key [ ] byte ) ( [ ] byte , error ) {
return AesDecryptByteKey ( cryted , key )
}
// PKCS7Padding 补码
func PKCS7Padding ( ciphertext [ ] byte , blocksize int ) [ ] byte {
padding := blocksize - len ( ciphertext ) % blocksize
padtext := bytes . Repeat ( [ ] byte { byte ( padding ) } , padding )
return append ( ciphertext , padtext ... )
}
// PKCS7UnPadding 去码
func PKCS7UnPadding ( origData [ ] byte ) ( [ ] byte , error ) {
length := len ( origData )
unpadding := int ( origData [ length - 1 ] )
if unpadding > length {
fmt . Println ( hex . EncodeToString ( origData ) )
return [ ] byte { } , errors . New ( "PKCS7UnPadding err: unpadding > length" )
}
return origData [ : ( length - unpadding ) ] , nil
}
// RsaEncryptByVer 根据RsaKey 版本进行加密
func RsaEncryptByVer ( origData [ ] byte , ver uint32 ) ( [ ] byte , error ) {
var publicKey [ ] byte
switch ver {
case 133 : //新疆号使用
publicKey = [ ] byte ( public_key_133 )
case 135 : //国内国外
publicKey = [ ] byte ( public_key_135 )
case 190 :
publicKey = [ ] byte ( public_key_190 )
case 189 :
publicKey = [ ] byte ( public_key_189 )
case 99 :
publicKey = [ ] byte ( public_key_99 )
}
block , _ := pem . Decode ( publicKey )
if block == nil {
return nil , errors . New ( "public key error" )
}
pubInterface , err := x509 . ParsePKIXPublicKey ( block . Bytes )
if err != nil {
return nil , err
}
pub := pubInterface . ( * rsa . PublicKey )
return rsa . EncryptPKCS1v15 ( rand . Reader , pub , origData )
}
// RsaEncrypt 加密
func RsaEncrypt ( origData [ ] byte ) ( [ ] byte , error ) {
block , _ := pem . Decode ( publicKey )
if block == nil {
return nil , errors . New ( "public key error" )
}
pubInterface , err := x509 . ParsePKIXPublicKey ( block . Bytes )
if err != nil {
return nil , err
}
pub := pubInterface . ( * rsa . PublicKey )
return rsa . EncryptPKCS1v15 ( rand . Reader , pub , origData )
}
// EncKeyRsaEncrypt 加密
func EncKeyRsaEncrypt ( origData [ ] byte ) ( [ ] byte , error ) {
block , _ := pem . Decode ( encAesKeyPublicKey )
if block == nil {
return nil , errors . New ( "public key error" )
}
pubInterface , err := x509 . ParsePKIXPublicKey ( block . Bytes )
if err != nil {
return nil , err
}
pub := pubInterface . ( * rsa . PublicKey )
return rsa . EncryptPKCS1v15 ( rand . Reader , pub , origData )
}
// CdnRsaEncrypt Cdn,Aes加密
func CdnRsaEncrypt ( origData [ ] byte ) ( [ ] byte , error ) {
block , _ := pem . Decode ( cdnRsaPubKey )
if block == nil {
return nil , errors . New ( "public key error" )
}
pubInterface , err := x509 . ParsePKIXPublicKey ( block . Bytes )
if err != nil {
return nil , err
}
pub := pubInterface . ( * rsa . PublicKey )
return rsa . EncryptPKCS1v15 ( rand . Reader , pub , origData )
}
// Md5Value 计算字符串的MD5值
func Md5Value ( str string ) string {
data := [ ] byte ( str )
has := md5 . Sum ( data )
md5str := fmt . Sprintf ( "%x" , has )
return md5str
}
func MD5ToLower ( str string ) string {
h := md5 . New ( )
h . Write ( [ ] byte ( str ) )
return hex . EncodeToString ( h . Sum ( nil ) )
}
func ALLGather ( Data [ ] string ) string {
var M string
for i := 0 ; i < len ( Data ) ; i ++ {
M += Data [ i ]
}
return M
}
func BytesToInt ( bys [ ] byte ) int {
bytebuff := bytes . NewBuffer ( bys )
var data int64
binary . Read ( bytebuff , binary . BigEndian , & data )
return int ( data )
}
// Md5ValueByte 计算字节数组的MD5值
func Md5ValueByte ( data [ ] byte , bUpper bool ) string {
has := md5 . Sum ( data )
tmpString := "%x"
if bUpper {
tmpString = "%X"
}
md5str := fmt . Sprintf ( tmpString , has )
return md5str
}
// Md5Value16 计算16为的md5值
func Md5Value16 ( data [ ] byte ) [ 16 ] byte {
return md5 . Sum ( data )
}
// Adler32 计算Adler32
func Adler32 ( adler uint32 , data [ ] byte ) uint32 {
s1 := adler & 0xffff
s2 := ( adler >> 16 ) & 0xffff
length := len ( data )
for index := 0 ; index < length ; index ++ {
s1 = ( s1 + uint32 ( data [ index ] ) ) % 65521
s2 = ( s2 + s1 ) % 65521
}
return ( s2 << 16 ) + s1
}
// AesEncryptECB Aes ECB模式加密
func AesEncryptECB ( origData [ ] byte , key [ ] byte ) ( encrypted [ ] byte ) {
cipher , _ := aes . NewCipher ( key )
length := ( len ( origData ) + aes . BlockSize ) / aes . BlockSize
plain := make ( [ ] byte , length * aes . BlockSize )
copy ( plain , origData )
pad := byte ( len ( plain ) - len ( origData ) )
for i := len ( origData ) ; i < len ( plain ) ; i ++ {
plain [ i ] = pad
}
encrypted = make ( [ ] byte , len ( plain ) )
// 分组分块加密
for bs , be := 0 , cipher . BlockSize ( ) ; bs <= len ( origData ) ; bs , be = bs + cipher . BlockSize ( ) , be + cipher . BlockSize ( ) {
cipher . Encrypt ( encrypted [ bs : be ] , plain [ bs : be ] )
}
return encrypted
}
// AesDecryptECB AesDecryptECB
func AesDecryptECB ( encrypted [ ] byte , key [ ] byte ) ( decrypted [ ] byte ) {
cipher , _ := aes . NewCipher ( key )
decrypted = make ( [ ] byte , len ( encrypted ) )
for bs , be := 0 , cipher . BlockSize ( ) ; bs < len ( encrypted ) ; bs , be = bs + cipher . BlockSize ( ) , be + cipher . BlockSize ( ) {
cipher . Decrypt ( decrypted [ bs : be ] , encrypted [ bs : be ] )
}
trim := 0
if len ( decrypted ) > 0 {
trim = len ( decrypted ) - int ( decrypted [ len ( decrypted ) - 1 ] )
}
return decrypted [ : trim ]
}
// Sha1 计算Sha值
func Sha1 ( data [ ] byte ) [ ] byte {
sha1 := sha1 . New ( )
sha1 . Write ( data )
return sha1 . Sum ( [ ] byte ( "" ) )
}
func split ( buf [ ] byte , lim int ) [ ] [ ] byte {
var chunk [ ] byte
chunks := make ( [ ] [ ] byte , 0 , len ( buf ) / lim + 1 )
for len ( buf ) >= lim {
chunk , buf = buf [ : lim ] , buf [ lim : ]
chunks = append ( chunks , chunk )
}
if len ( buf ) > 0 {
chunks = append ( chunks , buf [ : ] )
}
return chunks
}
// 根据Key 版本进行加密
func RsaEncryptByVerNew ( origData [ ] byte , ver uint32 ) ( [ ] byte , error ) {
publicKey := ""
switch ver {
case 133 :
publicKey = public_key_133_hex
break
case 135 :
publicKey = public_key_135_hex
break
case 125 :
publicKey = public_key_125_hex
case 182 :
publicKey = public_key_182_hex
}
bigInt := new ( big . Int )
n , ok := bigInt . SetString ( publicKey , 16 )
if ! ok {
return nil , errors . New ( "转换失败" )
}
pub := & rsa . PublicKey {
N : n ,
E : 65537 ,
}
partLen := pub . N . BitLen ( ) / 8 - 11
chunks := split ( origData , partLen )
buffer := bytes . NewBuffer ( nil )
for _ , chunk := range chunks {
bs , err := rsa . EncryptPKCS1v15 ( rand . Reader , pub , chunk )
if err != nil {
return nil , err
}
buffer . Write ( bs )
}
return buffer . Bytes ( ) , nil
}
// NoCompressRsaByVer NoCompressRsa 根据Key 版本进行加密
// todo: 2020/6/17 12:44 增加
func NoCompressRsaByVer ( data [ ] byte , ver uint32 ) [ ] byte {
retData , err := RsaEncryptByVerNew ( data , ver )
if err != nil {
fmt . Println ( "NoCompressRsaByVer err == " , err . Error ( ) )
}
return retData
}
// CompressAndRsaByVer 压缩后进行rsa加密 根据Key 版本进行加密
// todo: 2020/6/17 12:44 增加
func CompressAndRsaByVer ( data [ ] byte , ver uint32 ) [ ] byte {
newData := CompressByteArray ( data )
retData , err := RsaEncryptByVerNew ( newData , ver )
if err != nil {
fmt . Println ( "CompressAndRsaByVer err == " , err . Error ( ) )
}
return retData
}
// NoCompressRsa NoCompressRsa
func NoCompressRsa ( data [ ] byte ) [ ] byte {
rsaKeySize := 2048
rsaLen := rsaKeySize / 8 - 12
dataLen := len ( data )
retData := make ( [ ] byte , 0 )
if dataLen <= rsaLen {
retData , err := RsaEncrypt ( data )
if err != nil {
log . Info ( "CompressAndRsa err = " , err )
}
return retData
}
// 分块加密
blockCnt := dataLen / rsaLen
if dataLen % rsaLen != 0 {
blockCnt = blockCnt + 1
}
var tmpBlockCnt = blockCnt
for tmpBlockCnt > 0 {
startPos := ( blockCnt - tmpBlockCnt ) * rsaLen
blockSize := startPos + rsaLen
if tmpBlockCnt == 1 {
blockSize = dataLen
}
tmpBuf := make ( [ ] byte , 0 )
tmpBuf = append ( tmpBuf , data [ startPos : blockSize ] ... )
encodedData , err := RsaEncrypt ( tmpBuf )
if err != nil {
log . Info ( "CompressAndRsa err = " , err )
}
retData = append ( retData , encodedData [ 0 : ] ... )
tmpBlockCnt = tmpBlockCnt - 1
}
return retData
}
// CompressAndRsa 压缩后进行rsa加密
func CompressAndRsa ( data [ ] byte ) [ ] byte {
newData := CompressByteArray ( data )
rsaKeySize := 2048
rsaLen := rsaKeySize / 8 - 12
newDataLen := len ( newData )
if newDataLen <= rsaLen {
newData , err := RsaEncrypt ( newData )
if err != nil {
log . Info ( "CompressAndRsa err = " , err )
}
return newData
}
retData := make ( [ ] byte , 0 )
// 分块加密
blockCnt := newDataLen / rsaLen
if newDataLen % rsaLen != 0 {
blockCnt = blockCnt + 1
}
var tmpBlockCnt = blockCnt
for tmpBlockCnt > 0 {
startPos := ( blockCnt - tmpBlockCnt ) * rsaLen
blockSize := startPos + rsaLen
if tmpBlockCnt == 1 {
blockSize = newDataLen
}
tmpBuf := make ( [ ] byte , 0 )
tmpBuf = append ( tmpBuf , newData [ startPos : blockSize ] ... )
encodedData , err := RsaEncrypt ( tmpBuf )
if err != nil {
PrintLog ( err . Error ( ) )
}
retData = append ( retData , encodedData [ 0 : ] ... )
tmpBlockCnt = tmpBlockCnt - 1
}
return retData
}
// CompressAes 压缩然后aes加密
func CompressAes ( aesKey [ ] byte , data [ ] byte ) [ ] byte {
newData := CompressByteArray ( data )
newData = AesEncrypt ( newData , aesKey )
return newData
}
// DecryptSnsVideoData 解密视频
func DecryptSnsVideoData ( data [ ] byte , encLen uint32 , tmpKey uint64 ) [ ] byte {
aacInst := CreateISAacInst ( tmpKey )
// 解密数据
for index := uint32 ( 0 ) ; index < encLen ; index += 8 {
randNumber := ISAacRandom ( aacInst )
tmpBytes := UInt64ToBytes ( randNumber )
for tmpIndex := uint32 ( 0 ) ; tmpIndex < 8 ; tmpIndex ++ {
realIndex := index + tmpIndex
if realIndex >= encLen {
return data
}
data [ index + tmpIndex ] ^ = tmpBytes [ tmpIndex ]
}
}
return data
}
func padding ( src [ ] byte , blocksize int ) [ ] byte {
padnum := blocksize - len ( src ) % blocksize
pad := bytes . Repeat ( [ ] byte { byte ( padnum ) } , padnum )
return append ( src , pad ... )
}
func unpadding ( src [ ] byte ) [ ] byte {
n := len ( src )
unpadnum := int ( src [ n - 1 ] )
return src [ : n - unpadnum ]
}
// PKCS5Padding PKCS5Padding
func PKCS5Padding ( cipherText [ ] byte , blockSize int ) [ ] byte {
padding := blockSize - len ( cipherText ) % blockSize
padText := bytes . Repeat ( [ ] byte { byte ( padding ) } , padding )
return append ( cipherText , padText ... )
}
// PKCS5UnPadding PKCS5UnPadding
func PKCS5UnPadding ( origData [ ] byte ) [ ] byte {
length := len ( origData )
unpadding := int ( origData [ length - 1 ] )
return origData [ : ( length - unpadding ) ]
}
// EncryptDESECB ECB加密
func EncryptDESECB ( data [ ] byte , keyByte [ ] byte ) ( [ ] byte , error ) {
block , err := des . NewCipher ( keyByte )
if err != nil {
return nil , err
}
bs := block . BlockSize ( )
//对明文数据进行补码
data = PKCS5Padding ( data , bs )
if len ( data ) % bs != 0 {
return nil , errors . New ( "Need a multiple of the blocksize" )
}
out := make ( [ ] byte , len ( data ) )
dst := out
for len ( data ) > 0 {
//对明文按照blocksize进行分块加密
//必要时可以使用go关键字进行并行加密
block . Encrypt ( dst , data [ : bs ] )
data = data [ bs : ]
dst = dst [ bs : ]
}
return out , nil
}
// DecryptDESECB DesEC解密
func DecryptDESECB ( data [ ] byte , key [ ] byte ) ( [ ] byte , error ) {
if len ( key ) > 8 {
key = key [ : 8 ]
}
block , err := des . NewCipher ( key )
if err != nil {
return nil , err
}
bs := block . BlockSize ( )
if len ( data ) % bs != 0 {
return nil , errors . New ( "DecryptDES crypto/cipher: input not full blocks" )
}
out := make ( [ ] byte , len ( data ) )
dst := out
for len ( data ) > 0 {
block . Decrypt ( dst , data [ : bs ] )
data = data [ bs : ]
dst = dst [ bs : ]
}
// out = PKCS5UnPadding(out)
return out , nil
}
// Encrypt3DES 3DES加密
// src: 8字节
// key: 16字节
func Encrypt3DES ( srcData [ ] byte , key [ ] byte ) ( [ ] byte , error ) {
if len ( srcData ) != 8 || len ( key ) != 16 {
return nil , errors . New ( "Encrypt3DES err: srcLen != 8 || keyLen != 16" )
}
tmpSrcData := make ( [ ] byte , 0 )
tmpSrcData = append ( tmpSrcData , srcData ... )
encData , err := EncryptDESECB ( tmpSrcData , key [ 0 : 8 ] )
if err != nil {
return nil , err
}
decData , err := DecryptDESECB ( encData , key [ 8 : ] )
if err != nil {
return nil , err
}
encData , err = EncryptDESECB ( decData [ 0 : 8 ] , key [ 0 : 8 ] )
if err != nil {
return nil , err
}
return encData [ 0 : 8 ] , err
}
// Decrypt3DES Encrypt3DES 3DES解密
func Decrypt3DES ( src [ ] byte , key [ ] byte ) [ ] byte {
block , _ := des . NewTripleDESCipher ( key )
blockmode := cipher . NewCBCDecrypter ( block , key [ : block . BlockSize ( ) ] )
blockmode . CryptBlocks ( src , src )
src = unpadding ( src )
return src
}
// AesEncryptECBTest Aes ECB模式加密
func AesEncryptECBTest ( origData [ ] byte , key [ ] byte , pad byte ) ( encrypted [ ] byte ) {
cipher , _ := aes . NewCipher ( key )
length := ( len ( origData ) + aes . BlockSize ) / aes . BlockSize
plain := make ( [ ] byte , length * aes . BlockSize )
copy ( plain , origData )
for i := len ( origData ) ; i < len ( plain ) ; i ++ {
plain [ i ] = pad
}
encrypted = make ( [ ] byte , len ( plain ) )
// 分组分块加密
for bs , be := 0 , cipher . BlockSize ( ) ; bs <= len ( origData ) ; bs , be = bs + cipher . BlockSize ( ) , be + cipher . BlockSize ( ) {
cipher . Encrypt ( encrypted [ bs : be ] , plain [ bs : be ] )
}
return encrypted
}
// CalcMsgCrc calc msg hash
func CalcMsgCrc ( data [ ] byte ) int {
salt1 := [ 16 ] byte { 0x5c , 0x50 , 0x7b , 0x6b , 0x65 , 0x4a , 0x13 , 0x09 , 0x45 , 0x58 , 0x7e , 0x11 , 0x0c , 0x1f , 0x68 , 0x79 }
salt2 := [ 16 ] byte { 0x36 , 0x3a , 0x11 , 0x01 , 0x0f , 0x20 , 0x79 , 0x63 , 0x2f , 0x32 , 0x14 , 0x7b , 0x66 , 0x75 , 0x02 , 0x13 }
pad1 := [ 0x30 ] byte {
0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 ,
0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 ,
0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 , 0x36 ,
}
pad2 := [ 0x30 ] byte {
0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c ,
0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c ,
0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c , 0x5c ,
}
md5hash := md5 . Sum ( data )
hashstr := hex . EncodeToString ( md5hash [ : ] )
hash1Data := make ( [ ] byte , 16 )
copy ( hash1Data , salt1 [ : ] )
hash1Data = append ( hash1Data , pad1 [ : ] ... )
hash1 := sha1 . New ( )
hash1 . Write ( hash1Data )
hash1 . Write ( [ ] byte ( hashstr ) )
h1 := hash1 . Sum ( nil )
hash2Data := make ( [ ] byte , 16 )
copy ( hash2Data , salt2 [ : ] )
hash2Data = append ( hash2Data , pad2 [ : ] ... )
hash2 := sha1 . New ( )
hash2 . Write ( hash2Data )
hash2 . Write ( h1 )
h2 := hash2 . Sum ( nil )
var b1 , b2 , b3 byte
size := len ( h2 )
for i := 0 ; i < size - 2 ; i ++ {
b1 = h2 [ i + 0 ] - b1 * 0x7d
b2 = h2 [ i + 1 ] - b2 * 0x7d
b3 = h2 [ i + 2 ] - b3 * 0x7d
}
return ( int ( 0x21 ) << 24 ) | ( ( int ( b3 ) & 0x7f ) << 16 ) | ( ( int ( b2 ) & 0x7f ) << 8 ) | ( int ( b1 ) & 0x7f )
}
func GetCRC32String ( msg string ) uint32 {
v := [ ] byte ( msg )
return GetCRC32 ( v )
}
func GetCRC32 ( data [ ] byte ) uint32 {
return crc32 . ChecksumIEEE ( data )
}
// 移位操作
func EncInt ( d int64 ) int64 {
a , b := int64 ( 0 ) , int64 ( 0 )
for i := 0 ; i < 16 ; i ++ {
a |= ( ( 1 << ( 2 * i ) ) & d ) << ( 2 * i )
b |= ( ( 1 << ( 2 * i + 1 ) ) & d ) << ( 2 * i + 1 )
}
return a | b
}
func IOSGetCidMd5 ( DeviceId , Cid string ) string {
Md5Data := MD5ToLower ( DeviceId + Cid )
return "A136" + Md5Data [ 5 : ]
}
func IOSGetCid ( s int ) string {
M := inttobytes ( s >> 12 )
return hex . EncodeToString ( M )
}
func inttobytes ( n int ) [ ] byte {
x := int32 ( n )
bytesBuffer := bytes . NewBuffer ( [ ] byte { } )
binary . Write ( bytesBuffer , binary . BigEndian , x )
return bytesBuffer . Bytes ( )
}
func IOSUuid ( DeviceId string ) ( uuid1 string , uuid2 string ) {
Md5DataA := MD5ToLower ( DeviceId + "SM2020032204320" )
//"b58b9b87-5124-4907-8c92-d8ad59ee0430"
fmt . Println ( "Md5DataA" , string ( Md5DataA ) )
uuid1 = fmt . Sprintf ( "%s-%s-%s-%s-%s" , Md5DataA [ 0 : 8 ] , Md5DataA [ 2 : 6 ] , Md5DataA [ 3 : 7 ] , Md5DataA [ 1 : 5 ] , Md5DataA [ 20 : 32 ] )
Md5DataB := MD5ToLower ( DeviceId + "BM2020032204321" )
uuid2 = fmt . Sprintf ( "%s-%s-%s-%s-%s" , Md5DataB [ 0 : 8 ] , Md5DataB [ 2 : 6 ] , Md5DataB [ 3 : 7 ] , Md5DataB [ 1 : 5 ] , Md5DataB [ 20 : 32 ] )
return
}