用 PHP或Python加密字符串,用iOS解密

可以使用对称加密算法(如 AES)来加密和解密字符串。对称加密适合这种跨平台加密解密的需求,因为可以使用相同的密钥和算法在不同的编程语言和系统之间进行加密和解密。

下面展示如何使用 PythonPHP 进行加密,然后用 iOS (Swift) 来解密。我们将使用 AES-256 加密,这种加密方式具有广泛的跨平台支持,并且安全性高。

1、问题背景

一位用户需要用 PHP 或 Python 加密字符串,并在 iOS 应用中对其进行解密。加密结果要求为 base64 编码,并在应用中进行解码并显示。用户了解到 PHP 中存在密钥填充问题,因此不介意使用 Python 或 Perl 来进行加密。

2、解决方案

PHP 代码:

php 复制代码
<?php

// 定义加密函数
function encrypt($data, $key) {
  // 将密钥转换为 16 位或 24 位或 32 位
  $key = substr(md5($key), 0, 16);

  // 使用 OpenSSL AES 加密数据
  return base64_encode(openssl_encrypt($data, 'AES-256-ECB', $key));
}

// 定义解密函数
function decrypt($data, $key) {
  // 将密钥转换为 16 位或 24 位或 32 位
  $key = substr(md5($key), 0, 16);

  // 使用 OpenSSL AES 解密数据
  return openssl_decrypt(base64_decode($data), 'AES-256-ECB', $key);
}

// 测试加密和解密
$data = 'Hello, world!';
$key = 'secret';

$encrypted_data = encrypt($data, $key);
$decrypted_data = decrypt($encrypted_data, $key);

echo "Encrypted Data: " . $encrypted_data . "\n";
echo "Decrypted Data: " . $decrypted_data . "\n";

?>

iOS 代码:

swift 复制代码
import CommonCrypto

class Encryption {
    // 加密函数
    static func encrypt(_ data: Data, key: Data) -> Data? {
        let keyLength = kCCKeySizeAES256
        let ivSize = kCCBlockSizeAES128

        // 分配内存用于保存加密结果
        var encryptedData = Data(repeating: 0, count: data.count + ivSize)

        // 加密数据
        guard let status: CCCryptorStatus = CCCrypt(CCOperation(kCCEncrypt),
                                                  CCAlgorithm(kCCAlgorithmAES),
                                                  CCOptions(kCCOptionECBMode),
                                                  key,
                                                  keyLength,
                                                  nil,
                                                  data,
                                                  data.count,
                                                  &encryptedData,
                                                  encryptedData.count,
                                                  nil) == kCCSuccess else {
            print("Encryption failed: \(status)")
            return nil
        }

        // 截取实际加密数据
        encryptedData = encryptedData[ivSize...]
        return encryptedData
    }

    // 解密函数
    static func decrypt(_ data: Data, key: Data) -> Data? {
        let keyLength = kCCKeySizeAES256
        let ivSize = kCCBlockSizeAES128

        // 分配内存用于保存解密结果
        var decryptedData = Data(repeating: 0, count: data.count)

        // 解密数据
        guard let status: CCCryptorStatus = CCCrypt(CCOperation(kCCDecrypt),
                                                  CCAlgorithm(kCCAlgorithmAES),
                                                  CCOptions(kCCOptionECBMode),
                                                  key,
                                                  keyLength,
                                                  nil,
                                                  data,
                                                  data.count,
                                                  &decryptedData,
                                                  decryptedData.count,
                                                  nil) == kCCSuccess else {
            print("Decryption failed: \(status)")
            return nil
        }

        // 返回解密结果
        return decryptedData
    }
}

// 测试加密和解密
let data = "Hello, world!".data(using: .utf8)!
let key = "secret".data(using: .utf8)!

// 加密数据
let encryptedData = Encryption.encrypt(data, key: key)
print("Encrypted Data: \(encryptedData!)")

// 解密数据
let decryptedData = Encryption.decrypt(encryptedData!, key: key)
print("Decrypted Data: \(String(data: decryptedData!, encoding: .utf8)!)")

确保 Python、PHP 和 Swift 都使用相同的算法(AES-256-CBC)和相同的填充方式(PKCS7)。

相关推荐
冷雨夜中漫步5 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴5 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再6 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
绵绵细雨中的乡音6 小时前
深入理解 ET 与 LT 模式及其在 Reactor 模型中的应用
服务器·网络·php
JH30736 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
2501_916008897 小时前
全面介绍Fiddler、Wireshark、HttpWatch、SmartSniff和firebug抓包工具功能与使用
android·ios·小程序·https·uni-app·iphone·webview
喵手7 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
Coder_Boy_7 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934737 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy7 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python