Skip to content

密钥生成

量U系统使用了多种语言,为了在各语言之间保持加密解密的兼容性,密钥的生成需要遵循一定的规则
下面给出几种语言的生成方法,采取任意一种生成即可,之后便可以在 Android、iOS 和 PHP服务端三者中使用这个密钥进行加解密

Android Java

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import android.util.Base64;

public class EncryptUtils {
    //AES算法相关
    private static final String ALGORITHM = "AES";

    /**
     * 生成一个随机的AES密钥
     *
     * @return 生成的密钥
     * @throws Exception 如果生成密钥失败
     */
    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(256); // 可以选择128, 192, 256位密钥长度
        return keyGenerator.generateKey();
    }

    /**
     * 将密钥转换为Base64编码的字符串
     *
     * @param secretKey 密钥
     * @return Base64编码的密钥字符串
     */
    public static String secretKeyToBase64(SecretKey secretKey) {
        return Base64.encodeToString(secretKey.getEncoded(), Base64.DEFAULT);
    }
}


//调用方法生成密钥 base64key
SecretKey secretKey = EncryptUtils.generateKey();
String base64key = EncryptUtils.secretKeyToBase64(secretKey);
Log.i("base64key===>", base64key);

标准 Java

package org.example;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

class EncryptUtils {
    private static final String ALGORITHM = "AES";
    /**
     * 生成AES密钥
     * @return 生成的AES密钥
     * @throws Exception 如果密钥生成过程中发生错误
     */
    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(256); // 可以选择128, 192, 256位密钥长度
        return keyGenerator.generateKey();
    }

    /**
     * 将密钥转换为Base64编码的字符串
     * @param secretKey 密钥
     * @return Base64编码的密钥字符串
     */
    public static String secretKeyToBase64(SecretKey secretKey) {
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }
}

public class getAesKey {
    public static void main(String[] args) throws Exception {
        SecretKey secretKey = EncryptUtils.generateKey();
        String base64key = EncryptUtils.secretKeyToBase64(secretKey);
        System.out.println("base64key===>" + base64key);
    }
}

Object-C

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>

@interface AESKeyGenerator : NSObject

+ (NSData *)generateKeyWithSize:(size_t)size;
+ (NSString *)base64EncodedStringFromData:(NSData *)data;

@end

@implementation AESKeyGenerator

+ (NSData *)generateKeyWithSize:(size_t)size {
    NSMutableData *keyData = [NSMutableData dataWithLength:size];
    SecRandomCopyBytes(kSecRandomDefault, size, keyData.mutableBytes);
    return keyData;
}

+ (NSString *)base64EncodedStringFromData:(NSData *)data {
    return [data base64EncodedStringWithOptions:0];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 生成256位(32字节)的AES密钥
        NSData *aesKey = [AESKeyGenerator generateKeyWithSize:32];
        
        // 将密钥转换为Base64编码的字符串
        NSString *base64Key = [AESKeyGenerator base64EncodedStringFromData:aesKey];
        
        NSLog(@"base64key===>%@", base64Key);
    }
    return 0;
}

PHP

<?php

class AESKeyGenerator
{
    /**
     * 生成AES密钥
     * @param int $keySize 密钥长度(128, 192, 256位)
     * @return string 生成的AES密钥(Base64编码)
     */
    public static function generateKey($keySize = 256)
    {
        // 计算密钥长度(字节数)
        $keyLength = $keySize / 8;
        // 生成随机字节作为AES密钥
        $key = openssl_random_pseudo_bytes($keyLength, $cryptoStrong);
        if (!$cryptoStrong) {
            throw new Exception("生成的密钥不够安全");
        }
        
        // 将密钥转换为Base64编码的字符串
        return base64_encode($key);
    }
}

try {
    // 生成256位的AES密钥
    $aesKeyBase64 = AESKeyGenerator::generateKey(256);
    echo "base64key===>" . $aesKeyBase64 . PHP_EOL;
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . PHP_EOL;
}

密钥填写的位置

Android客户端

//在上报数据前需要设置密钥,一般在 MainActivity 的 onCreate 方法中

RP.debug = true;
RP.base64SecretKey = "这里填写你的密钥";

iOS客户端

//AppDelegate.m 的 didFinishLaunchingWithOptions 方法中配置
[[LionuDeviceInfoSDK shareInstance] initSDKWithHostUrl:@"https://这里填写你的域名" APPID:@"这里填写应用appid"];
[LionuDeviceInfoSDK shareInstance].configModel.isLog = NO;
[LionuDeviceInfoSDK shareInstance].configModel.base64AesKey = @"这里填写你的密钥";

PHP服务端

//位于 项目目录/frontend/Common.php
defined('AES_BASE64_KEY')  || define('AES_BASE64_KEY', 'aIlPkPRHwHpmuJj2qCkbCRw6N4+KRcHYpf2VwU33lvU=');        //这里填写你的AES密钥

Android、iOS 和 PHP服务端三者的密钥一定要保持一致