Tag: encryption

如何在Swift中为IOS生成一个RSA非对称密钥对?

我需要一种在Swift中生成RSA非对称密钥对的方法。 我不需要把它存储在钥匙链或任何东西。 我只需要生成一个密钥对,并将两个键都转换为stringvariables。 密钥确实需要与PHP的另一端兼容。 我将使用对称encryption来保护私钥并将其存储在手机中。 我将发送公钥到在PHP中实现的Web服务,Web服务将公钥存储在数据库中。 该公钥将在稍后由Web服务使用,以encryption值为IOS应用程序的一次性密码和其他敏感值。 我将为从IOS应用程序stream向Web服务的小部分数据实现类似的scheme。 我可以在developer.apple.com上看到唯一logging的在Swift中生成密钥对的API声明: func SecKeyGeneratePairAsync(_ parameters: CFDictionary!, _ deliveryQueue: dispatch_queue_t!, _ result: SecKeyGeneratePairBlock!) 我试图找出如何使用这个,但XCode不喜欢下划线,我不知道我实际上应该做什么,或如何使用它。 即使XCode接受它,我不知道如何调用该函数和什么值来传递它,等等,我包括在顶部的“导入安全”,所以这不是问题。 这很荒谬,这应该是如此艰难。 我想要做的就是生成一个不对称的密钥对。 用PHP或者.NET或者Java或者其他语言来做这个是一块蛋糕,但是我找不到任何关于Swift的清晰的文档。 我必须使用这个应用程序的Swift。 我不想使用OpenSSL,因为它已经被弃用了。 我使用Swift是因为我血腥的仇恨目标C. Swift是我最终跳入IOS开发的原因。 我不知道如何将一个Objective C类与Swift集成,如果有的话,我真的宁愿有一个纯Swift解决scheme。 如果没有,我会很感激有关如何整合Objective C解决scheme并使其工作的一些指示。 上面的代码片段是苹果公司提供的唯一函数调用,自然是不完整的,没有意义,不起作用。 请帮助,如果你可以…这将不胜感激。 :) 谢谢 – =卡梅伦

读取encryption的数据库不适用于iOS 10

我正在开发iOS应用程序。 Encryption和Decryption读取和写入工作,直到iOS 9 。 但升级到iOS 10它开始给以下消息“文件被encryption或不是数据库”的问题。 对于DB encryption我使用以下代码: sqlite3 *db1; if (sqlite3_open([[self.databaseURL path] UTF8String], &db1) == SQLITE_OK) { const char* key = [@"strong" UTF8String]; sqlite3_key(db1, key, (int)strlen(key)); if (sqlite3_exec(db1, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) { NSLog(@"Password is correct, or a new database has been initialized"); } else { NSLog(@"Incorrect […]

Objective-C版本的PHP mcrypt_encrypt

从四周search,我可以find一些链接引用类似的问题,但没有什么是相当的工作,其驱使我疯狂…. 有人可以请给我一步一步的指导如何在Objective C中编写下面的PHP代码 我们正在创build一些需要encryption内容的Web服务调用,而且我们只给了PHPencryption样本。 为了清楚我们不想取消encryption,我们想要在IOS中镜像这个encryption过程。 非常感谢 function encrypt($plainText) { $initVector = "mysite.com"; $key = base64_decode("GfSDfXS14U8I3YglEFrMjMOOnESUMxN3wRTt1TeDosY="); $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $padding = $block – (strlen($plainText) % $block); $plainText .= str_repeat(chr($padding), $padding); $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plainText, MCRYPT_MODE_CBC, $initVector); $crypttext64 = base64_encode($crypttext); return $crypttext64; }

如何发送NSData作为密钥和四CCCrypt

我需要AES128encryption一个16字节的数据块使用一个密钥和一个IV到16字节的AES块。 我见过的每个CCCrypt示例都带有(NSString *)键和IV。 我的密钥和IV是NSData 16个字节。 我已经将NSData转换为hexstring,但结果是不正确的。 当我这样做时,我得到一个32字节的AES块。 所以我的问题是,我必须做什么来获得NSData作为一个const void *读入CCCrypt? – (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv theData:(NSData *)theData { char keyPtr[kCCKeySizeAES128 + 1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; bzero(ivPtr, sizeof(ivPtr)); if (iv) { [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; } NSUInteger dataLength = [theData length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; […]

为什么AES128解密在iPhone上花了这么长时间?

我解密从PHP服务器发送的图像。 我正在使用CryptoSwift库来解密图像,图像作为NSData进来,解密后,我从NSData创build一个UIImage。 但解密需要大约1分10秒,这很慢。 图像数据的大小: println(imageData.length) result: 32592 我相信这不是一个大文件吗? 这是我用来解密图像数据的代码: let aes = AES(key: keyData, iv: ivData, blockMode: .ECB) let decryptedData = aes?.decrypt(encryptedSnap, removePadding: true) let image = UIImage(data: decryptedData!) 我试过在不同的线程上运行这个进程,但是它给出了相同的结果。 当我解密图像时,模拟器使用100%的CPU,大约21.5MB的RAM。 任何帮助表示赞赏,谢谢!

如何避免硬编码encryption密钥(目标C)?

在我的Objective C代码中,我的代码中有一个使用者密钥和密码,用于SHA-1encryption。 我想知道的是我是否可以避免硬编码来提高安全性。 到目前为止,我发现了以下内容, 查找1 https://www.owasp.org/index.php/Technical_Risks_of_Reverse_Engineering_and_Unauthorized_Code_Modification#Cryptographic_Key_Replacement解释的步骤如下, 损坏在源代码中声明的静态键。 磁盘上的这些密钥应该被破坏,以防止对手分析和截获原密钥; 接下来,应用程序应该在需要密钥的代码使用之前修复密钥; 在使用密钥之前,应用程序应该执行密钥值的校验和,以validation未损坏的密钥与代码在构build时声明的值相匹配; 和 最后,应用程序在应用程序使用完该特定的调用之后,应立即重新损坏内存中的密钥。 find2 https://github.com/UrbanApps/UAObfuscatedString 有人可以帮我吗? 示例代码: + (NSString *) getOauthHeaderForRequestString:(NSString *)requestString { NSString *oauthConsumerKey = @"<consumer key which I want avoid hardcoding>"; NSString *oauthConsumerSecret = @"<consumer secret which I want to avoid hardcoding>"; NSString *oauthSignatureMethod = @"HMAC-SHA1"; NSString *oauthVersion = @"1.0"; NSString *oauthNonce = [self […]

AES128在iOS 7上截断解密的文本,在iOS 8上没有问题

使用ECB模式(这是玩具encryption)和PKCS7填充使用AES128encryption的密文,以下代码块导致在iOS 8下恢复完整的明文。 在iOS 7下运行相同的代码块会导致正确的明文,但会被截断。 为什么是这样? #import "NSData+AESCrypt.h" // <– a category with the below function #import <CommonCrypto/CommonCryptor.h> – (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv { char keyPtr[kCCKeySizeAES128 + 1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; bzero(ivPtr, sizeof(ivPtr)); if (iv) { [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; } NSUInteger dataLength = [self length]; size_t […]

使用Java中的身份validation标签进行AES GCM实现

我在我的Android项目中使用AES GCM身份validation,它工作正常。 但是当与openssl API比较时,获得authentication标签的一些问题会生成标签。 请find下面的java代码: SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); byte[] iv = generateRandomIV(); IvParameterSpec ivspec = new IvParameterSpec(iv); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec); int outputLength = cipher.getOutputSize(data.length); // Prepare output buffer byte[] output = new byte[outputLength]; int outputOffset = cipher.update(data, 0, data.length, output, 0);// Produce cipher text outputOffset += cipher.doFinal(output, outputOffset); […]

无法在iOS中创build具有文件保护function的SQLite3数据库

背景:我一直在观看WWDC 2011 – 208保护iOS应用程序。 他们提到如何使用称为NSFileProtection的文件encryption来保护我们的数据。 虽然我发现自动方法(@ 38:00)被窃听 ,我希望手动方式(@ 37:00)不是。 我尝试使用图像文件保护,一切都很好。 只有Sqlite我不能创build。 问题:我尝试使用sqlite3_open_v2创buildSQLite3数据库(无核心数据),并将SQLITE_OPEN_FILEPROTECTION_COMPLETE作为第三个参数的标志。 它不返回SQLITE_OK 。 码: if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_FILEPROTECTION_COMPLETE, NULL) == SQLITE_OK){ //everything works }else{ //failed } 更新: 正如borrrden提到的,都导致了以下错误代码: SQLITE_MISUSE (库使用不正确) 更新2: borrrden的第二个评论是正确的,指出两个标志的需要。 它遵循以下代码: if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_FILEPROTECTION_COMPLETE, NULL) == SQLITE_OK)

iOS SecItemCopyMatching RSA公钥格式?

我试图从一个已经生成的密钥对(两个SecKeyRef )中提取一个1024位的RSA公钥,以便通过线路发送它。 我所需要的只是一个普通(modulus, exponent)对,它应该占用131个字节(128为模数,3为指数)。 但是,当我作为一个NSData对象获取密钥信息,我得到140位而不是131.下面是一个示例结果: <30818902 818100d7 514f320d eacf48e1 eb64d8f9 4d212f77 10dd3b48 ba38c5a6 ed6ba693 35bb97f5 a53163eb b403727b 91c34fc8 cba51239 3ab04f97 dab37736 0377cdc3 417f68eb 9e351239 47c1f98f f4274e05 0d5ce1e9 e2071d1b 69a7cac4 4e258765 6c249077 dba22ae6 fc55f0cf 834f260a 14ac2e9f 070d17aa 1edd8db1 0cd7fd4c c2f0d302 03010001> 重试密钥生成几次并比较得到的NSData对象,所有密钥保持相同的字节是第一个7: <30818902 818100> 最后三个字节看起来像指数(65537,一个公共值)。 “模数”和指数之间还有两个字节: <0203> 有更多的encryption经验的人可以帮助我确定这是什么编码? DER? 我如何正确解码模数和指数? 我尝试手动剥离模数和指数使用 NSData* modulus = [keyBits subdataWithRange:(NSRange){ […]