go语言 跟 php nodejs通用的加解密代码
kevin.Zhu 发布于:2024-1-19 21:50 分类:文摘 有 58 人浏览,获得评论 0 条
//go package main import ( "crypto/aes" "crypto/cipher" ) func encrypt(plaintext []byte, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } // PKCS7Padding为数据进行块对齐处理 paddingSize := block.BlockSize() - len(plaintext)%block.BlockSize() paddedText := append(plaintext, bytes.Repeat([]byte{byte(paddingSize)}, paddingSize)...) encryptedData := make([]byte, len(paddedText)) for i := 0; i < len(paddedText); i += block.BlockSize() { block.Encrypt(encryptedData[i:], paddedText[i:]) } return encryptedData, nil } func decrypt(ciphertext []byte, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } decryptedData := make([]byte, len(ciphertext)) for i := 0; i < len(ciphertext); i += block.BlockSize() { block.Decrypt(decryptedData[i:], ciphertext[i:]) } unpadedText := unPadPKCS7(decryptedData) // 去除块对齐后的空字节 return unpadedText, nil } func unPadPKCS7(data []byte) []byte { length := len(data) unpaddingLen := int(data[length-1]) return data[:length-unpaddingLen] } func main() { plaintext := []byte("Hello World") key := []byte("secret_key") encrypted, _ := encrypt(plaintext, key) fmt.Println("Encrypted Data:", string(encrypted)) decrypted, _ := decrypt(encrypted, key) fmt.Println("Decrypted Data:", string(decrypted)) } //php function encrypt($plaintext, $key){ return openssl_encrypt($plaintext, 'AES-256-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING); } function decrypt($ciphertext, $key){ return openssl_decrypt($ciphertext, 'AES-256-ECB', $key, OPENSSL_RAW_DATA | OPENSL_ZERO_PADDING); } $plaintext = "Hello World"; $key = "secret_key"; $encrypted = base64_encode(encrypt($plaintext, $key)); echo "Encrypted Data: " . $encrypted . "\n"; $decrypted = decrypt(base64_decode($encrypted), $key); echo "Decrypted Data: " . $decrypted . "\n"; //nodejs const forge = require('node-forge'); function encrypt(plaintext, key){ const cipher = forge.cipher.createCipher('AES-CTR', forge.util.hexToBytes(key)); cipher.start({ iv: forge.random.getBytesSync(8) }); cipher.update(forge.util.createBuffer(plaintext, 'utf8')); cipher.finish(); let encryptedHex = cipher.output.toHex(); return encryptedHex; } function decrypt(ciphertext, key){ const decipher = forge.cipher.createDecipher('AES-CTR', forge.util.hexToBytes(key)); decipher.start({ iv: forge.random.getBytesSync(8) }); decipher.update(forge.util.createBuffer(ciphertext, 'hex')); decipher.finish(); let decryptedHex = decipher.output.toHex(); return decryptedHex; }