返回

PHP加密.Net解密:跨平台文件安全传输实战

php

PHP 加密,.Net 解密:跨平台文件加解密实践

在构建跨平台应用程序时,数据在不同技术栈之间的安全传输成为一个常见的问题。此案例讨论如何在 PHP 中加密文件,然后用 .Net 应用程序进行解密。兼容性问题是关键,需要选择双方都支持且安全的加密算法。

对称加密方案

对称加密使用相同的密钥进行加密和解密。这使得过程更快,更适合文件这种大型数据处理。常用对称加密算法包括 AES,它提供高水平的安全性,并且在 PHP 和 .Net 中都有良好支持。

PHP 端加密:

<?php
function encryptFile($inputFile, $outputFile, $key) {
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt(file_get_contents($inputFile), 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
    file_put_contents($outputFile, $iv . $encrypted);
}

$key = 'your-secret-key-should-be-longer';
$inputFile = 'plain.txt';
$outputFile = 'encrypted.bin';
encryptFile($inputFile, $outputFile, $key);
?>

操作步骤:

  1. 创建 encrypt.php 文件,复制以上代码。
  2. 替换 $key 为实际使用的密钥,密钥的长度很重要,必须是 32字节,或其扩展后的安全密钥。
  3. 替换 $inputFile 为待加密的文件,以及 $outputFile 为输出的加密文件。
  4. 运行 PHP 脚本 php encrypt.php,得到加密后的文件 encrypted.bin
  5. IV (Initialization Vector,初始化向量) 与密文一起存储,保证了相同的明文用相同密钥加密时,每次加密出的密文也不同。

** .Net 端解密:**

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class DecryptFile
{
    public static void Decrypt(string inputFile, string outputFile, string key)
    {
        byte[] encryptedData = File.ReadAllBytes(inputFile);
        byte[] iv = new byte[16];
        Array.Copy(encryptedData, iv, 16);
        byte[] cipherText = new byte[encryptedData.Length - 16];
        Array.Copy(encryptedData, 16, cipherText, 0, cipherText.Length);
        
        using (Aes aesAlg = Aes.Create())
        {
             
           aesAlg.Key = Encoding.UTF8.GetBytes(key);
           aesAlg.IV = iv;
           aesAlg.Mode = CipherMode.CBC;
           aesAlg.Padding = PaddingMode.PKCS7;


            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamWriter swDecrypt = new StreamWriter(outputFile))
                    {
                            csDecrypt.CopyTo(swDecrypt.BaseStream);


                        
                    }
                }
            }
            Console.WriteLine("Decryption completed.");
        }

    }
     public static void Main(string[] args)
    {

            string key = "your-secret-key-should-be-longer"; 
            string inputFile = "encrypted.bin";
            string outputFile = "decrypted.txt";
            Decrypt(inputFile,outputFile,key);
           

        Console.ReadKey();

    }
}

操作步骤:

  1. 创建 C# 项目(如Console应用)。
  2. 复制以上 C# 代码到对应的代码文件。
  3. 修改代码中的key,inputFile,和outputFile,key的取值要与PHP端保持一致,需要32位字符。
  4. 生成项目。
  5. 运行生成的exe文件。解密后的内容存入decrypted.txt.

代码说明:

  • openssl_encrypt()openssl_decrypt(): PHP 的 OpenSSL 扩展提供了强大的加密功能,允许使用各种算法和模式。

  • Aes.Create(): .NET 的 System.Security.Cryptography 命名空间提供了 AES 加密类。

  • 需要注意PHP端,采用了cbc 模式加密, 在.Net 端需要对 Aes.Mode = CipherMode.CBC; 以及 aesAlg.Padding = PaddingMode.PKCS7进行设定,使两侧保持加密参数一致,避免解密错误.

  • 此外 Encoding.UTF8.GetBytes(key);将key转换成bytes数组,确保C# 使用与php相同字符编码,才能解密成功。

  • 需要注意 PHP 端使用 OPENSSL_RAW_DATA, 表明使用原始字节流,即二进制模式。在 .NET 解密中同样注意要二进制模式,因此不采用UTF8.GetString()将明文转成String类型,而是直接将字节流写到文件中。

安全建议:

  • 密钥的安全管理至关重要,不要将密钥硬编码在代码中。可以使用环境变量或安全的密钥管理系统。
  • 对于传输,SSL/TLS (HTTPS) 是必需的,它保护密钥和加密的数据在传输过程中的安全。

加密文件传输

一旦文件在 PHP 中加密,就需要将其传输到 .NET 应用可访问的位置。最常见的方法包括通过 SFTP,FTPS,或 Web API 进行安全传输。

SFTP 和 FTPS 提供加密的数据传输通道,减少了中间人攻击的风险。选择 SFTP,因为它可以更简单的管理秘钥授权,并且更为安全。

小结

通过使用兼容的加密算法和安全的传输协议,可以在不同的技术栈中安全地传输和处理数据。虽然这个例子使用的是对称加密,根据需求也可用非对称加密方式如RSA,但在传输文件方面,对称加密由于效率上的优势更加实用。正确的密钥管理,数据完整性和数据传输的安全,是实现端到端数据保护的保障。选择适合自身应用场景的工具和方式非常重要。