标签: commoncrypto

其他人在使用iOS 5加密时遇到问题?

有一个(相当复杂)的应用程序在iOS 4上正常工作但在iOS 5上因解密问题而失败.它正在解密SQLite数据库页面,最后16个字节似乎没有被正确解密.

这对任何人都响了吗?

更新

我已经确定,当CCCryptorUpdate的缓冲区长度为1008(1024 - 16)时,它只解密992个字节(如dataOutMoved参数中所报告的那样).如果CCCryptorFinal返回剩余的字节,这将是正常的,但它报告移动了零字节.但是,CCCryptorFinal报告了一个-4304返回代码(这是一个无用的kCCDecodeError).

更新2

我已经把它当作彻头彻尾的bug了.我比较了逐字节加密输出和输入到解密,并比较了密钥.相同.但是如果缓冲区长度是1008,那么解密总是会失败,即使解密器被赋予了更大的输出缓冲区(在这种情况下它说它需要1024).我认为它适用于1024,但我没有超过第一个奇怪的大小缓冲区来告诉.

等等

好吧,似乎没有解密.这是使用"多合一" CCCrypt()接口,消除了与CCCryptorCreate /更新/最后的测序错误的机会.我想知道这是AES128的问题吗?

奇怪的是,当数据库的第1页被加密时,加密总是报告比我告诉的更多移动16个字节 - 如果我告诉它1008它报告1024,如果我告诉1024它报告1040.没有其他页面这样做,我不知道CCCrypt如何知道它正在处理什么页面.就像我说的,好奇.

发现它(我认为)

旧代码正在指定kCCOptionPKCS7Padding,据我所知,它只应用于加密缓冲区长度不是块长度的倍数(以及提供额外输出缓冲区空间的位置).这导致几乎所有解密操作都以-4304失败.但是在iOS 4中,操作仍然会移动他们已经解密的数据(基本上是所有这些),而iOS 5改变了,如果操作失败(并且最后一个块几乎总是失败),所有数据移动都被抑制.

关闭填充选项可使代码工作而不会发布任何错误.

encryption ios ios5 commoncrypto

3
推荐指数
1
解决办法
1620
查看次数

在IOS中实施AES256加密

这是我的java代码.现在我想在Objective-C中实现相同的功能.

Cipher encryptCipher;
IvParameterSpec iv = new IvParameterSpec(key);
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = encryptCipher.doFinal(dataToEncrypt.getBytes());
Log.d("TAG", "encrypted string:"
        + Base64.encodeToString(encrypted, Base64.DEFAULT));
return Base64.encodeToString(encrypted, Base64.DEFAULT).trim();
Run Code Online (Sandbox Code Playgroud)

这是我的iOS实现

- (NSData *)AES256EncryptWithKey:(NSString*)key
{
    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize           = dataLength + kCCBlockSizeAES128;
    void* buffer                = malloc(bufferSize);

    size_t numBytesEncrypted    = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                  kCCAlgorithmAES128,
                                  kCCOptionPKCS7Padding,
                                  keyPtr,
                                  kCCKeySizeAES256,
                                  NULL,
                                  [self bytes],
                                  dataLength,
                                  buffer, …
Run Code Online (Sandbox Code Playgroud)

iphone encryption aes nsdata commoncrypto

3
推荐指数
1
解决办法
6126
查看次数

MD5 3DES加密Swift

我有一个应用程序,必须发送已由MD5首先加密,然后由3DES加密的登录凭据.

我已设法使用CryptoSwift通过MD5加密字符串.但是我在Swift上找不到任何加密3DES的东西.

我尝试过CommonCrypto.据我所知,这是在C中,但可以使用桥接头导入到Objective C中.

我找到了一些文章和教程,告诉我如何将CommonCrypto导入Swift,或者通过桥接头(带有警告它不能用于框架)或者通过Model.map.然而,两者都不起作用 我不确定这是否是最新版iOS或Xcode的限制.

有人可以请一个替代方案吗?

谢谢

EDITED

嗨,请看我采取的以下步骤

  1. 好的,我创建了一个名为newEncrypt的新项目.
  2. 我选择不使用标头选项,因为说明这仅限于非框架应用程序/
  3. 我在newEncrypt中创建了一个名为CommonCrypto的文件夹,里面有一个module.map文件.其内容为:模块CommonCrypto [system] {header"/usr/include/CommonCrypto/CommonCrypto.h"export*}
  4. 将$ {SRCROOT}/CommonCrypto添加到swift编译器搜索路径 - 导入路径.调试和发布.
  5. 这是指令停止的地方.我假设我需要将CommonCrypto导入我的班级.此错误"无法构建目标C模块'CommonCrypto'.我还假设我应该在"/usr/include/CommonCrypto/CommonCrypto.h"或"/newEncrypt/CommonCrypto/CommonCrypto.h"中有CommonCrypto库文件(来自CommonCryto'include'文件夹)?我试过这个,但是我只是得到了同样的错误.
  6. 然后,我尝试使用#import添加头文件,并将-lfoo添加到其他链接器标志调试和释放(尽管这可能不是正确的),以防万一仍然需要这样做.但我仍然得到同样无法建立客观c错误.我确定我做错了很明显

encryption 3des md5 commoncrypto swift

2
推荐指数
1
解决办法
4150
查看次数

使用CommonCrypto进行Swift AES加密

我正在使用Swift 2.1XCode 7.1上开发iOS应用程序,我正在尝试使用CommonCrypto库使用AES 128位PKCS7填充进行简单加密.

代码工作,但每次我尝试将NSData对象转换NSString为String然后我得到一个零,应用程序崩溃.

我调试了应用程序,NSData对象不是零.

当我尝试解包String可选时,会发生错误.

如何解决这个问题?并将NSData对象正确转换为String?这是我的代码

static func AESEncryption(phrase: String,key: String,ivKey: String,encryptOrDecrypt: Bool) -> String {

let phraseData = phrase.dataUsingEncoding(NSUTF8StringEncoding)
let ivData = ivKey.dataUsingEncoding(NSUTF8StringEncoding)
    let keyData: NSData! = key.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
    let keyBytes         = UnsafePointer<Void>(keyData.bytes)
    let keyLength        = size_t(kCCKeySizeAES128)
    let dataLength       = Int(phraseData!.length)
    let dataBytes        = UnsafePointer<Void>(phraseData!.bytes)
    let bufferData       = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)!
    let bufferPointer    = UnsafeMutablePointer<Void>(bufferData.mutableBytes)
    let bufferLength …
Run Code Online (Sandbox Code Playgroud)

encryption ios commoncrypto swift swift2.1

2
推荐指数
1
解决办法
2389
查看次数

Swift 5 + kCCDecrypt (CommonCrypto):无法解密

试图Swift 5根据大量其他类似问题在 .

我正在使用CommonCrypto+CCCrypt来加密/解密(AES、256 密钥、随机 iv)。

我倾向于NSData.byteswithUnsafeBytes(这只是太混乱Swift 5)。

我的encrypt功能是这样的:

func encrypt(_ string: String) throws -> Data {
    guard let dataToEncrypt: Data = string.data(using: .utf8) else {
        throw AESError.stringToDataFailed
    }

    // Seems like the easiest way to avoid the `withUnsafeBytes` mess is to use NSData.bytes.
    let dataToEncryptNSData = NSData(data: dataToEncrypt)

    let bufferSize: Int = ivSize + dataToEncryptNSData.length + kCCBlockSizeAES128
    let buffer = UnsafeMutablePointer<NSData>.allocate(capacity: bufferSize)
    defer …
Run Code Online (Sandbox Code Playgroud)

aes commoncrypto swift5

2
推荐指数
1
解决办法
7504
查看次数

为什么我的initWithData返回nil表示在将NSData转换为从通过CommonCrypto加密返回的NSString后出错?

这是我的代码:

-(IBAction)encryptText:(id)sender
{
key = self.tvKey.text;

CCCryptorStatus status = kCCSuccess;                                        
algorithm = kCCAlgorithmAES128;                                                
CCOptions opts = kCCOptionPKCS7Padding;

NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];

NSString *plainString = [NSString stringWithFormat:@"%@", self.tvEntryText.text];
NSData *plainData = [plainString dataUsingEncoding:NSUTF8StringEncoding];

NSData *encryptedData = [plainData dataEncryptedUsingAlgorithm: algorithm     
                                                           key: keyData       
                                          initializationVector: nil             
                                                       options: opts           
                                                         error: &status];    


if ( status != kCCSuccess ) {
    NSError * err = [NSError errorWithCCCryptorStatus: status];
    self.lblKeyMsg.text = [NSString stringWithFormat:@"Encryption failed: %s", [[err localizedDescription] UTF8String]];
    self.lblKeyMsg.textColor = [UIColor redColor];
    return;
}

NSString *encryptedString = [[[NSString …
Run Code Online (Sandbox Code Playgroud)

encryption objective-c ios4 commoncrypto

1
推荐指数
1
解决办法
3223
查看次数

如何在iOS上使用AES GCM进行加密?

我需要在GCM模式下使用AES加密来加密/解密某些数据,但显然使用CommonCrypto API无法做到这一点.这里之前已经问过这个问题,但是接受的答案并不是我想要的,因为我需要使用这个特定的算法.

有任何想法吗?我应该使用OpenSSL吗?因为我听说在iOS中使用它时会有一些错误.

我正在寻找Swift的答案,但Objective-C也没问题.

cryptography ios commoncrypto swift

1
推荐指数
2
解决办法
5412
查看次数

AES 中的 CCCrypt 解密

在我的 iOS 应用程序中,我必须解密来自服务器的数据。我使用CommonCrypto框架,经过多次尝试,我成功解密了

CCCrypt(kCCDecrypt, // operation
                     kCCAlgorithmAES128, // Algorithm
                     kCCOptionPKCS7Padding | kCCModeCBC, // options
                     key.bytes, // key
                     key.length, // keylength
                     nil,// iv
                     cipherData.bytes, // dataIn
                     cipherData.length, // dataInLength,
                     decryptedData.mutableBytes, // dataOut
                     decryptedData.length, // dataOutAvailable
                     &outLength); // dataOutMoved
Run Code Online (Sandbox Code Playgroud)

在java服务器中,数据被加密

byte[] buff = new byte[100];
byte[] buf2 = new byte[32];
byte[] mainKey = ...
byte[] raw = ...
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine());
KeyParameter par = new KeyParameter(mainKey);
int minSize = cipher.getOutputSize(data.length);
byte[] outBuf = new byte[minSize];
int length1 …
Run Code Online (Sandbox Code Playgroud)

aes ios commoncrypto

1
推荐指数
1
解决办法
1747
查看次数

Swift-无法将类型'UnsafePointer &lt;Any&gt;'的值转换为预期的参数类型'UnsafePointer &lt;_&gt;'

我正在尝试快速使用CommonCrypto(在https://github.com/sergejp/CommonCrypto的帮助下)。这是我的代码:

UnsafeRawPointer(ivData!.withUnsafeBytes
{(pointer) -> UnsafePointer<Any> in
    let ivBuffer = pointer
})
Run Code Online (Sandbox Code Playgroud)

错误是:

无法将类型'UnsafePointer'的值转换为预期的参数类型'UnsafePointer <_>'

<_>意味着什么?我需要做什么?谢谢。

encryption types pointers commoncrypto swift

1
推荐指数
1
解决办法
5428
查看次数

如何在iOS中使用CCHmac?

我想在iOS中使用salt生成SHA512.我找到了以下代码片段来实现这一点,但我发现该CCHmac()功能适用于mac.

-(NSString *)hashString:(NSString *)data withSalt:(NSString *)salt
{
    const char *cKey  = [salt cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSString *hash;
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", cHMAC[i]];
    hash = output;
    return hash;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用CC_SHA512()函数,那么我将如何使用salt字符串?

ios commoncrypto

0
推荐指数
1
解决办法
1584
查看次数

HMAC SHA512在Swift 3.1中使用CommonCrypto

我正在尝试加密数据以发送到API.

API要求将数据作为hmac_sha512加密哈希发送.

我已经找到了各种各样的例子,说明它可能是如何为sha1其他人(而不是sha512)以及旧版本的Swift完成的.

我尝试过的所有例子都没有 swift 3.1

任何正确方向的帮助将不胜感激.

编辑:

在PHP中,我使用以下方法成功发送:

    $sign = hash_hmac('sha512', $post_data, $this->secret);
Run Code Online (Sandbox Code Playgroud)

编辑2:

did add briding header,我不知道下一步该做什么!由于之后的代码示例不适用于swift 3.1 :(

编辑3:

解决了!猜猜看,我正在错误地创建新的标题!:(

PS我试图避免使用CryptoSwift,专注于CommonCrypto.

下面给出的答案是不正确的,因为它不允许hmac获得加密密钥.我做了研究,终于搞定了.这篇文章包含了hmac的工作示例项目:https://github.com/nabtron/hmacTest

xcode hmac sha512 commoncrypto swift

0
推荐指数
1
解决办法
2746
查看次数