gpt4 book ai didi

ios - 如何加密/解密安全 QR - 在 Swift 中编码为可读格式

转载 作者:行者123 更新时间:2023-12-05 07:21:32 26 4
gpt4 key购买 nike

我已成功扫描并从 QR 中读取字符串值。但无法将字符串值转换为可读格式。 https://uidai.gov.in/images/resource/User_manulal_QR_Code_15032019.pdf我曾尝试使用上述过程进行转换,但未能成功。

1) 我已经尝试将库转换为 BigInt 并转换为二进制值

 let str = String(self.metadataStringValue, radix: 2)
print(str)

2)成功将大整数转换为字节数组

 let byteArray = Array(BigUInt(str)!.serialize())
print(byteArray)

3)使用苹果的解压算法(zlib)

4) 从索引0读取字节数组的值,直到第一个分隔符值“255”,并将此字节数组值转换为编码为“ISO-8859-1”的字符串。

var firstDelimiter = ArraySlice<UInt8>()
var firstDelimiterArray = [UInt8]()
var delimiterIndex:Int = 0

for index in 0..<byteArray.count {

if byteArray[index] == 255 {
firstDelimiter = byteArray[delimiterIndex...index]
delimiterIndex = index + 1

firstDelimiterArray = firstDelimiter.map { $0 }

let data2 = Data(bytes: firstDelimiterArray, count: firstDelimiterArray.count)
print(data2 as NSData)
}
}

5)“ISO-8859-1”编码无法转换为可读格式(我使用了 .isolatin1)

最佳答案

对于 swift 5,

我已经解码了 aadhar 的安全二维码并获取了姓名、出生日期和性别

引用:https://uidai.gov.in/images/resource/User_manulal_QR_Code_15032019.pdf

安装这些 pod

pod 'BigInt'
pod 'GzipSwift'

导入这些 pod

import BigInt
import Gzip

扫描二维码后调用下面的函数

func scannedData(code: String) {
print(code)

//Convert to BigInt
let bInt = BigInt(code, radix: 10)

//Convert to bytes
let byteData = bInt?.serialize() ?? Data()

//Convert to byte array
var data = Array(bInt?.serialize() ?? Data())

// Decompress
let decompressedData: Data
if byteData.isGzipped {
decompressedData = try! byteData.gunzipped()
data = [UInt8](decompressedData)
} else {
decompressedData = byteData
}

var firstDelimiter = ArraySlice<UInt8>()
var firstDelimiterArray = [UInt8]()
var delimiterIndex:Int = 0
var set:Int = 0

for index in 0..<data.count {

if data[index] == 255 {
set = set + 1
firstDelimiter = data[delimiterIndex..<index]
delimiterIndex = index + 1

firstDelimiterArray = firstDelimiter.map { $0 }
let sepData = Data(bytes: firstDelimiterArray, count: firstDelimiterArray.count)
// name
if set == 3 {
let name = convertString(data: sepData)
}
// DOB
if set == 4 {
let dob = convertString(data: sepData)
}
// Gender
if set == 5 {
let gender = convertString(data: sepData)
}
}
}
}

要对分隔的字节进行编码,请使用此函数

 private func convertString(data: Data) -> String {
return String(data: data, encoding: .windowsCP1250) ?? ""
}

使用这个扩展

extension BigInt {

public func serialize() -> Data {
var array = Array(BigUInt.init(self.magnitude).serialize())

if array.count > 0 {
if self.sign == BigInt.Sign.plus {
if array[0] >= 128 {
array.insert(0, at: 0)
}
} else if self.sign == BigInt.Sign.minus {
if array[0] <= 127 {
array.insert(255, at: 0)
}
}
}

return Data.init(bytes: array)
}

public init(_ data: Data) {
var dataArray = Array(data)
var sign: BigInt.Sign = BigInt.Sign.plus

if dataArray.count > 0 {
if dataArray[0] >= 128 {
sign = BigInt.Sign.minus

if dataArray.count > 1 {
if dataArray[0] == 255, dataArray.count > 1 {
dataArray.remove(at: 0)
} else {
dataArray[0] = UInt8(256 - Int(dataArray[0]))
}
}
}
}

let magnitude = BigUInt.init(Data.init(bytes: dataArray))

self .init(sign: sign, magnitude: magnitude)
}
}

关于ios - 如何加密/解密安全 QR - 在 Swift 中编码为可读格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56853537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com