diff --git a/main.go b/main.go index 5a0fbd0..d13fe8c 100755 --- a/main.go +++ b/main.go @@ -216,7 +216,20 @@ func GenRsaKey(bits int) (prvkey, pubkey []byte, err error) { } - +func ParseRSAPrivateKeyFromPEM(pemData string) (*rsa.PrivateKey, error) { + var keyData = []byte(pemData) + // 解析PEM块 + block, _ := pem.Decode(keyData) + if block == nil { + return nil, fmt.Errorf("private key error not block in file") + } + // 解析RSA私钥 + privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return nil, err + } + return privateKey, nil +} func parsePrivateKey(privateKeyFile string) (*rsa.PrivateKey, error) { // 读取私钥文件 @@ -337,6 +350,43 @@ func RSA_Decrypts(cipherText []byte, path string) []byte { return bytesDecrypt } +// RSA_DecryptsOne RSA解密支持分段解密 +func RSA_DecryptsOne(cipherText []byte, privateKeyStr string) []byte { + //打开文件 + var bytesDecrypt []byte + // 读取私钥文件转成字节数组 + keyData := []byte(privateKeyStr) + + //pem解码 + block, _ := pem.Decode(keyData) + //X509解码 + privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + fmt.Println(err.Error()) + os.Exit(0) + } + p := privateKey.(*rsa.PrivateKey) + keySize := p.Size() + srcSize := len(cipherText) + log.Println("密钥长度", keySize, "密文长度", srcSize) + var offSet = 0 + var buffer = bytes.Buffer{} + for offSet < srcSize { + endIndex := offSet + keySize + if endIndex > srcSize { + endIndex = srcSize + } + bytesOnce, err := rsa.DecryptPKCS1v15(rand.Reader, p, cipherText[offSet:endIndex]) + if err != nil { + return nil + } + buffer.Write(bytesOnce) + offSet = endIndex + } + bytesDecrypt = buffer.Bytes() + return bytesDecrypt +} + // RsaEncryptBlock 公钥加密-分段 func RsaEncryptBlock(src []byte, path string) (bytesEncrypt []byte, err error) { //打开文件 @@ -389,7 +439,7 @@ func RsaEncryptBlock(src []byte, path string) (bytesEncrypt []byte, err error) { func timing(client mqtt.Client) { //定时器,10秒钟执行一次 - ticker := time.NewTicker(5 * time.Second) + ticker := time.NewTicker(10 * time.Second) for { time := <-ticker.C fmt.Println("定时器====>", time.String()) @@ -424,6 +474,8 @@ func timing(client mqtt.Client) { //decrptCode := RSA_Decrypts(decodeByte, privatePath) //fmt.Println("解密后的字符串:") //fmt.Println(string(decrptCode)) + + } } } @@ -445,14 +497,19 @@ var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Me if err != nil { fmt.Println(err.Error()) } - decrptCode := RSA_Decrypts(decodeByte, privatePath) + //decrptCode := RSA_Decrypts(decodeByte, privatePath) + + privateKeyPEM := `-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL3dDf12MSeIY2jm5QpUSSoMhrJOWLbOt5fXQepPaNO0M30A+3C4SFZrM/9WA5ehazO1u1m1LAkYzoSDRH3MMJsrJC3lCGDeOROteu+safuP9k/npU1YQu/+Ll2xEJNxyvUx4jLGM4LamiMI6ytM3gdnOAGP4YRQo9Etwo6I986yg/seCQC5rza9M4iBamoin7U8h9yOMKrM6xK/k9CcY/vn5+Uhe3Pvk4qj/2Ff3OXkkc1wfdILqdLwLOKL0Tb3ZciwG0p1CKO80yf5hyYoWjqZk5Rcd07nTo2gqTFGfLl9sqI9/+ipMDtnHlAgMBAAECggEATJd5yCC6lusdMRO5FOBUyUaUi9X2i1AU+RZKAynQySvSnbavUgExW58tRCHBUrGW9gJp59ft1N8J8hHhSO18NDY4H7laBlVdnwmYjRqtFo2VQO6sD4G8JRDION5f2iIxn/b2fYDI9H8vILfJRbNgtTSILyGlzTYUZzhLKxCh+8IsN96Nic8wa5COd1vZZmdhf2y8TG8clFWmozaScNSAATx7y+8XLVWjjWiIRZ6xQvx0uQPUParc9KihXXTKR2pA22yPIdz+U4MGD4kC0eczlcFKZ/dYv9e7OIGgnJfT0idSCu7nYb1pxJ1LxD9fS6IScNTF5dSe0OIL98e+XdyoAQKBgQDRep+5cW4iAKrEMH+djmcXAkoMiYtNVtnu0efLE8dP6vjYytQi368X9SdcASbfrQ31eEZmr/xQnlUF8oyHGkI38YS8dpAHzQcrkP3BljbbzB/3gJZaUdghGsDrK0xAJIzzmFKQpeKnGtr23vxUgaGrNsCYvQ0eQ7+5056KXS4r5QKBgQC6r8xtRSaje6L4WIydjWvYywsmRO0Of0aJLMDA/Wt2MWhHfh7ba9oI1cKGN80ap7xB2a9lQLgpv+C53wNtE5SpvjxsikAj96nUMMhGy9ojXrUith6HQhiINETz6Shnznd+AyrXP6KI/RpfA5nkDB5nrJxODwtYLP467IL7Cv7OAQKBgQCl4KxKdH/5fP28jYsAgJsxpSZt9xzQCU5Zxu396ZOSvUaApVyGoQpNtluMh3z48lhzYOKevgzW6gn5w69z7F8zXZT2iAxVoQ1kelP2z7RxKJrHqpNkwhqbXEwX7RlcUZUr8BqxYCqymJl7k+fMIzqaEalBSbLxnEReKi0I8/Bz4QKBgHK4b0ZCtVDHPEmimJ6E9l4dv/c/afF7swu+zaCK2ouiJvOwBCRQbYb6XPR/u/GCXASXUdpF4CX/vIhcDE3uN2/r8FO+zVWM7vbvF1OyF5WesG7pPW9e5ZZlkG3WvLa1wOZV6fCmMSo/ZwI2Q05JSDHrd43cXttLotrw1jiQ9C4BAoGBAKi4SOoOVQ5J5HQCDkBwPbG1AOLHFinzfoDl26GF/8Hy7fmmd1JiRTFldQp/A9VTAABz3sVYmMB92HSIaJhuDMoYJNI2Cf/cZifsv7vUL8cbLn+lPsKsebiuB0m0g4P2qLwLfegfNGEgA7lA5HIz3SELqbdp3iuqJeQl1fsJqD74 +-----END PRIVATE KEY-----` + decrptCode := RSA_DecryptsOne(decodeByte, privateKeyPEM) + fmt.Println("解密后的字符串:") fmt.Println(string(decrptCode)) fmt.Println("-----user--------") var user models.User json.Unmarshal(decrptCode, &user) fmt.Println(user) - //models.SaveUser(&user) if models.GetUser(&user) { models.UpdateUser(&user)