如何CommonCrypto
在iOS的Swift框架中导入?
我理解如何CommonCrypto
在Swift应用程序中使用:您添加#import <CommonCrypto/CommonCrypto.h>
到桥接标头.但是,Swift框架不支持桥接头.该文件说:
您可以导入具有纯Objective-C代码库,纯Swift代码库或混合语言代码库的外部框架.无论框架是用单一语言编写还是包含来自两种语言的文件,导入外部框架的过程都是相同的.导入外部框架时,请确保将要导入的框架的"定义模块"构建设置设置为"是".
您可以使用以下语法将框架导入到不同目标中的任何Swift文件中:
import FrameworkName
Run Code Online (Sandbox Code Playgroud)
不幸的是,导入CommonCrypto
不起作用.也没有添加#import <CommonCrypto/CommonCrypto.h>
到伞头.
我正在尝试在Swift中创建字符串的HMAC SHA-1哈希,但无法弄清楚如何与API进行交互,因为它似乎没有导入CommonCrypto框架.我尝试了各种不同形式的"import CommonCrypto"并创建了一个桥接头文件,但没有一个有所作为.
奇怪的是,如果我创建一个Objective-C类,我可以毫无问题地与API交互,所以这似乎是Swift独有的.
如果有人能告诉我uint8_t digest[CC_SHA1_DIGEST_LENGTH]
Swift中的等价物,我会非常感激
我正在尝试在swift中实现AES加密.Android和C#的加密解密工作正常.我需要在swift中实现它.这是Android和C#的当前代码,后面是这个.
我试着用
但它都不起作用.当我在服务器上发送加密的字符串时,它没有被解密.
任何帮助将不胜感激
提交或更新应用时,您面临的一个问题是:
自上次上传此产品的二进制文件以来,您是否添加或更改了加密功能?
图片:
我的问题是,如果我使用从<CommonCrypto/CommonCryptor.h>
库中获得的加密,我是否必须对该Q进行检查?
我有一个文件,我想加密,发送到iPhone,并使用CommonCrypto在iPhone上解密.与同事交谈时,我得到了不同的回答.有些人认为,由于它是一个包含在内的公平游戏框架,其他人则表示你必须得到政府的批准.
看起来CommonCrypto支持(充其量)采用ECB密码模式的AES 128位加密.所以,这就是我计划使用的东西.
附注:我计划在github 上使用AlanQuatermain/aqtoolkit中的NSData+CommonCrypto
类别.这只是CommonCrypto的一个包装,仅此而已.
相关的是,如果您使用HTTPS(SSL),是否必须选中YES?请参阅进行HTTPS(TLS)连接的应用程序的iPhone加密导出合规性 - 续.我不需要https连接,但这让我感到惊讶......
如何使用RSA密钥在iOS上签名和验证某些数据(最好使用系统自己的libcommonCrypto
)?
我正在尝试使用CommonCrypto
生成密钥,PBKDF2
但我似乎无法导入CommonCrypto/CommonKeyDerivation.h
,我只是错误,它没有找到.
有任何想法吗?
编辑:我应该提到我已经添加了安全框架,我可以导入所有其他CommonCrypto
标头.
我试图根据sha256使哈希成为密码值.我已经搜索了这个,但没有关于swift 2的信息.这个解决方案对我没用
func sha256(data:String) -> String {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &digest)
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joinWithSeparator("")
}
Run Code Online (Sandbox Code Playgroud)
它给出错误:使用未解析的标识符CC_SHA256_DIGEST_LENGTH
我正试图从Swift调用CCKeyDerivationPBKDF.
我在Project-Bridging-Header.h中导入了所需的标题:
#import <CommonCrypto/CommonKeyDerivation.h>
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,桥接标题似乎可以正常导入我的项目中的其他Objective C代码).
在Xcode中,我可以从我的.swift文件跳转到这里显示的定义:
int
CCKeyDerivationPBKDF( CCPBKDFAlgorithm algorithm, const char *password, size_t passwordLen,
const uint8_t *salt, size_t saltLen,
CCPseudoRandomAlgorithm prf, uint rounds,
uint8_t *derivedKey, size_t derivedKeyLen)
Run Code Online (Sandbox Code Playgroud)
最后,当我尝试这样调用函数时:
let result = CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2), NSString(password).UTF8String, size_t(passwordLength), UnsafePointer<UInt8>(salt.bytes), size_t(salt.length), CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256), uint(actualRoundCount), UnsafeMutablePointer<UInt8>(derivedKey.mutableBytes), size_t(derivedKey.length));
Run Code Online (Sandbox Code Playgroud)
...我得到这个编译器错误:
无法使用类型'(CCPBKDFAlgorithm,UnsafePointer,size_t,UnsafePointer,size_t,CCPseudoRandomAlgorithm,uint,UnsafeMutablePointer,size_t)的参数列表调用'init'
我相信所有演员阵容都是正确的(实际上编译器错误帮助我识别每个参数的每个问题) - 这让我觉得编译器理解我调用CCKeyDerivationPBKDF的意图.
但是,在所有其他转换错误消失后,编译器会感到困惑并认为我正在尝试使用初始化程序构造一个类.
希望有人能告诉我我的方式的错误.
(Xcode 6 beta 7)
根据要求,上下文中的完整代码:
class func generateAesKeyForPassword(password: String, salt: NSData, roundCount: UInt?, error: NSErrorPointer) -> (key: NSData, actualRoundCount: UInt)?
{
let derivedKey = NSMutableData(length: kCCKeySizeAES256)
let passwordLength = size_t(password.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
var …
Run Code Online (Sandbox Code Playgroud) 我正在将一个有效的Objective-C类别(NSData + AESCrypt.m)移植到Swift,我发现了一个与指针一起工作的问题.Swift中加密部分的代码正确编译,但生成运行时EXEC_BAD_ACCES错误.
我到目前为止的代码是(我试图尽可能地剖析代码):
let key = "123456789012345678901234567890120"
let keyLength = UInt(kCCKeySizeAES256 + 1)
let keyPointer = strdup(key) // Convert key to <UnsafeMutablePointer<Int8>
let message = "Don´t try to read this text. Top Secret Stuff"
let data = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let dataBytes = data?.bytes
let length = data?.length
let dataLength = UInt(length!)
let dataPointer = UnsafePointer<UInt8>(dataBytes!)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
let cryptBufferSize = UInt(dataLength + kCCBlockSizeAES128) …
Run Code Online (Sandbox Code Playgroud) 我在Swift框架中使用CommonCrypto - 它已经运行了一年多了.
我使用了这里找到的解决方案:在Swift框架中导入CommonCrypto
具体来说,为了从Swift框架引用CommonCrypto,我不得不:
module.map
在CommonCrypto
我的框架的Xcode项目旁边的文件夹中创建一个文件.module.map
内容:
module CommonCrypto [system]
{
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/CommonCrypto/CommonCrypto.h"
link "CommonCrypto"
export *
}
Run Code Online (Sandbox Code Playgroud)
CommonCrypto
$(SDKROOT)/usr/lib/system
import CommonCrypto
这很好用; 有点复杂 - 但它奏效了.
但是,在Xcode 7.3 beta 1(7D111g)中,此技术不再有效.
它似乎libcommonCrypto.tbd
已从$(SDKROOT)/usr/lib/system
Xcode-beta.app中删除:我无法在iPhoneOS SDK文件夹结构下找到它.
所以我得到这些错误:
ld:警告:找不到选项'-L/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/usr/lib/system'ld的目录:ld:library找不到架构arm64 clang的-lCommonCrypto:错误:链接器命令失败,退出代码为1(使用-v查看调用)
如果疯狂的模块地图业务被更简单的东西取代,那将是很棒的.比如说,只是使用import CommonCrypto
在任何情况下,我不知道如何解决这个问题,所以任何帮助都表示赞赏.
如果解决方案与上一个问题中找到的解决方案大不相同,我在这里要求提出一个新问题,尽管我很欣赏这可能不合适.
commoncrypto ×10
ios ×6
swift ×5
aes ×2
cryptography ×2
objective-c ×2
swift2 ×2
digest ×1
encryption ×1
frameworks ×1
hash ×1
hmacsha1 ×1
https ×1
macos ×1
pbkdf2 ×1
pkcs#7 ×1
rsa ×1
sha256 ×1
xcode7 ×1