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;
}