有一个(相当复杂)的应用程序在iOS 4上正常工作但在iOS 5上因解密问题而失败.它正在解密SQLite数据库页面,最后16个字节似乎没有被正确解密.
这对任何人都响了吗?
我已经确定,当CCCryptorUpdate的缓冲区长度为1008(1024 - 16)时,它只解密992个字节(如dataOutMoved参数中所报告的那样).如果CCCryptorFinal返回剩余的字节,这将是正常的,但它报告移动了零字节.但是,CCCryptorFinal报告了一个-4304返回代码(这是一个无用的kCCDecodeError).
我已经把它当作彻头彻尾的bug了.我比较了逐字节加密输出和输入到解密,并比较了密钥.相同.但是如果缓冲区长度是1008,那么解密总是会失败,即使解密器被赋予了更大的输出缓冲区(在这种情况下它说它需要1024).我认为它适用于1024,但我没有超过第一个奇怪的大小缓冲区来告诉.
好吧,似乎没有解密.这是使用"多合一" CCCrypt()接口,消除了与CCCryptorCreate /更新/最后的测序错误的机会.我想知道这是AES128的问题吗?
奇怪的是,当数据库的第1页被加密时,加密总是报告比我告诉的更多移动16个字节 - 如果我告诉它1008它报告1024,如果我告诉1024它报告1040.没有其他页面这样做,我不知道CCCrypt如何知道它正在处理什么页面.就像我说的,好奇.
旧代码正在指定kCCOptionPKCS7Padding,据我所知,它只应用于加密缓冲区长度不是块长度的倍数(以及提供额外输出缓冲区空间的位置).这导致几乎所有解密操作都以-4304失败.但是在iOS 4中,操作仍然会移动他们已经解密的数据(基本上是所有这些),而iOS 5改变了,如果操作失败(并且最后一个块几乎总是失败),所有数据移动都被抑制.
关闭填充选项可使代码工作而不会发布任何错误.
这是我的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) 我有一个应用程序,必须发送已由MD5首先加密,然后由3DES加密的登录凭据.
我已设法使用CryptoSwift通过MD5加密字符串.但是我在Swift上找不到任何加密3DES的东西.
我尝试过CommonCrypto.据我所知,这是在C中,但可以使用桥接头导入到Objective C中.
我找到了一些文章和教程,告诉我如何将CommonCrypto导入Swift,或者通过桥接头(带有警告它不能用于框架)或者通过Model.map.然而,两者都不起作用 我不确定这是否是最新版iOS或Xcode的限制.
有人可以请一个替代方案吗?
谢谢
EDITED
嗨,请看我采取的以下步骤
我正在使用Swift 2.1在XCode 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) 试图Swift 5根据大量其他类似问题在 .
我正在使用CommonCrypto+CCCrypt来加密/解密(AES、256 密钥、随机 iv)。
我倾向于NSData.bytes在withUnsafeBytes(这只是太混乱中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) 这是我的代码:
-(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) 在我的 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) 我正在尝试快速使用CommonCrypto(在https://github.com/sergejp/CommonCrypto的帮助下)。这是我的代码:
UnsafeRawPointer(ivData!.withUnsafeBytes
{(pointer) -> UnsafePointer<Any> in
let ivBuffer = pointer
})
Run Code Online (Sandbox Code Playgroud)
错误是:
无法将类型'UnsafePointer'的值转换为预期的参数类型'UnsafePointer <_>'
这<_>意味着什么?我需要做什么?谢谢。
我想在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字符串?
我正在尝试加密数据以发送到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
commoncrypto ×11
encryption ×6
ios ×5
swift ×5
aes ×3
3des ×1
cryptography ×1
hmac ×1
ios4 ×1
ios5 ×1
iphone ×1
md5 ×1
nsdata ×1
objective-c ×1
pointers ×1
sha512 ×1
swift2.1 ×1
swift5 ×1
types ×1
xcode ×1