You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.7 KiB
147 lines
4.7 KiB
package main |
|
|
|
import ( |
|
"bytes" |
|
"crypto/rand" |
|
"crypto/rsa" |
|
"crypto/x509" |
|
"encoding/base64" |
|
"encoding/json" |
|
"encoding/pem" |
|
"errors" |
|
"fmt" |
|
"io/ioutil" |
|
) |
|
|
|
func main() { |
|
// 设备公共信息 |
|
deviceInfo := map[string]string{ |
|
"bootTimeInSec": "1595643553", |
|
"countryCode": "CN", |
|
"language": "zh-Hans-CN", |
|
"deviceName": "e910dddb2748c36b47fcde5dd720eec1", |
|
"systemVersion": "14.0", |
|
"machine": "iPhone10,3", |
|
"memory": "3955589120", |
|
"disk": "63900340224", |
|
"sysFileTime": "1595214620.383940", |
|
"model": "D22AP", |
|
"timeZone": "28800", |
|
"deviceInitTime": "1632467920.301150749", |
|
} |
|
|
|
// 加密设备信息 |
|
encryptedDeviceByte, err := encrypt(deviceInfo) |
|
if err != nil { |
|
fmt.Printf("加密错误 encrypt: %v\n", err) |
|
return |
|
} |
|
fmt.Printf("加密后的设备信息: encryptedDeviceByte: %s\n", encryptedDeviceByte) |
|
|
|
//url := "https://caid.china-caa.org/v1.0/get" |
|
//data := map[string]interface{}{"dev_id": "10702", "encrypted_device_info": encryptedDeviceByte} |
|
//g.Client().SetHeader("Content-Type", "application/json") |
|
//g.Client().SetHeader("Cache-Control", "no-cache") |
|
//log.Printf("sendMsgHugeAmount - url: %s, data: %s", url, gjson.MustEncodeString(data)) |
|
//marshal, _ := json.Marshal(data) |
|
//bytes, err := g.Client().Post(context.TODO(), url, string(marshal)) |
|
//if err != nil { |
|
// return |
|
//} |
|
//src := string(bytes.ReadAll()) |
|
//tmp, err := gcharset.ToUTF8("UTF-8", src) |
|
//if err != nil { |
|
// return |
|
//} |
|
//fmt.Println("Deposit - json: ", tmp) |
|
////tmp, err := SendCaidMsg(ctx, url, data) |
|
//if err != nil { |
|
// fmt.Println("SendCaidMsg err:", err) |
|
// return |
|
//} |
|
//resJson, err := gjson.DecodeToJson(tmp) |
|
//if err != nil { |
|
// fmt.Println("SendCaidMsg DecodeToJson err:", err) |
|
// return |
|
//} |
|
//if resJson != nil && resJson.Get("code").Int() != 0 { |
|
// fmt.Println("SendCaidMsg err:", resJson.Get("message").String()) |
|
// return |
|
//} |
|
//caid := "J5LdxnMrcpDiNrn2QLZvCPavphS9nUqu7uwCEjLkEvtP2blwhevgGvQD7AKajkEc+PIC2TuIFxbSGK9Jsm27CrsW446pi+gIIc3OdKB4jqQJoDD77BbJC3I105DnsEwgR8uLvSVy0NgqFq+rf4GRYwp93Jy2eZdDKkS+Y0BgTEQkedK1P29hyYEELLQzvJrq9XlwfYx1QcGGcofZmq56B65IbQQfRvoXAiSl2cm12qFkpD8KbPmvy66xE6yu3SFAMC6iAEdfW4W8hz0Qv9Bht2nhDxsm4c39z1mU41s1oP5lJ5kkUl4yU3NWRO19jIYOm8lMJb19oDc+weBaMkgIbQ==" |
|
// |
|
//fmt.Println("Deposit - caid: ", caid) |
|
|
|
//encryptedDeviceInfo, err := encryptWithPublicKey(jsonStr, vm.publicKey) |
|
//if err != nil { |
|
// fmt.Printf("加密错误 encryptWithPublicKey: %v\n", err) |
|
// return |
|
//} |
|
|
|
// 将encryptedDeviceInfo填入请求中的encrypted_device_info字段 |
|
|
|
// 解密响应数据示例 |
|
// 假设从响应中获取的data字段值 |
|
|
|
//fmt.Printf("解密后的响应数据: %s\n ,decryptedByte: %s\n", decryptedData, string(decryptedByte)) |
|
|
|
} |
|
|
|
func ImportSPKIPublicKeyPEM() *rsa.PublicKey { |
|
pubKeyBytes, err := ioutil.ReadFile("manifest/config/dev_10702/public_for_api.pem") |
|
if err != nil { |
|
fmt.Println(err) |
|
} |
|
fmt.Printf("encrypt pubKeyBytes: %s\n", string(pubKeyBytes)) |
|
body, _ := pem.Decode(pubKeyBytes) |
|
fmt.Printf(" body.Bytes : %s\n byte: %s\n", body.Type, body.Bytes) |
|
publicKey, _ := x509.ParsePKIXPublicKey(body.Bytes) |
|
if publicKey, ok := publicKey.(*rsa.PublicKey); ok { |
|
fmt.Printf("publicKey : %d\n ", publicKey.Size()) |
|
return publicKey |
|
} else { |
|
return nil |
|
} |
|
} |
|
|
|
func encrypt(deviceInfo map[string]string) (string, error) { |
|
pubKey := ImportSPKIPublicKeyPEM() |
|
fmt.Printf("data: len: %d\n pubkey: %v\n", len(deviceInfo), pubKey) |
|
|
|
// 2. 计算RSA最大加密块大小(PKCS#1 v1.5填充需要11字节) |
|
keySize := pubKey.Size() // 密钥字节长度(如2048位密钥为256字节) |
|
maxEncryptBlock := keySize - 11 // 最大单次加密数据长度(256-11=245字节) |
|
if maxEncryptBlock <= 0 { |
|
return "", errors.New("无效的RSA公钥长度(必须≥11字节)") |
|
} |
|
|
|
// 序列化设备信息为JSON |
|
data, err := json.Marshal(deviceInfo) |
|
if err != nil { |
|
fmt.Printf("JSON序列化错误: %v\n", err) |
|
return "", fmt.Errorf("JSON序列化错误: %v\n", err) |
|
} |
|
plaintext := data |
|
// 3. 分块加密 |
|
var encryptedBlocks [][]byte |
|
for offset := 0; offset < len(plaintext); offset += maxEncryptBlock { |
|
end := offset + maxEncryptBlock |
|
if end > len(plaintext) { |
|
end = len(plaintext) |
|
} |
|
block := plaintext[offset:end] |
|
|
|
// 执行RSA加密(使用公钥指数e) |
|
encryptedBlock, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, block) |
|
if err != nil { |
|
return "", fmt.Errorf("第%d字节块加密失败: %w", offset, err) |
|
} |
|
encryptedBlocks = append(encryptedBlocks, encryptedBlock) |
|
} |
|
|
|
// 4. 拼接所有加密块并进行Base64编码 |
|
encryptedBytes := bytes.Join(encryptedBlocks, nil) |
|
// 4. 拼接所有加密块并进行Base64编码 |
|
return base64.StdEncoding.EncodeToString(encryptedBytes), nil |
|
|
|
}
|
|
|