Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS三重DES加密生成与Android不同的字符串_Android_Ios_Tripledes - Fatal编程技术网

iOS三重DES加密生成与Android不同的字符串

iOS三重DES加密生成与Android不同的字符串,android,ios,tripledes,Android,Ios,Tripledes,我在Android应用程序中使用了TripleDES加密,它根据需要返回预期的字符串。但是,当在iOS中使用CommonCrypto实现相同功能时,返回的字符串与预期的不同 public String encrypt(String message, String secretKey) throws Exception { MessageDigest md = MessageDigest.getInstance("md5"); byte[] digestOfPasswor

我在Android应用程序中使用了TripleDES加密,它根据需要返回预期的字符串。但是,当在iOS中使用CommonCrypto实现相同功能时,返回的字符串与预期的不同

    public String encrypt(String message, String secretKey) throws Exception {

    MessageDigest md = MessageDigest.getInstance("md5");
    byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
    byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);

    for (int j = 0, k = 16; j < 8;) {
        keyBytes[k++] = keyBytes[j++];
    }

    KeySpec keySpec = new DESedeKeySpec(keyBytes);
    SecretKey key = SecretKeyFactory.getInstance("DESede").generateSecret(keySpec);

    Cipher cipher = Cipher.getInstance("DESede");
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] plainTextBytes = message.getBytes("utf-8");
    byte[] buf = cipher.doFinal(plainTextBytes);
    byte[] base64Bytes = Base64.encodeBase64(buf);
    String base64EncryptedString = new String(base64Bytes);

    return base64EncryptedString;
}
publicstringencrypt(字符串消息、字符串secretKey)引发异常{
MessageDigest md=MessageDigest.getInstance(“md5”);
byte[]digestOfPassword=md.digest(secretKey.getBytes(“utf-8”);
byte[]keyBytes=Arrays.copyOf(digestOfPassword,24);
对于(int j=0,k=16;j<8;){
keyBytes[k++]=keyBytes[j++];
}
KeySpec KeySpec=新的DESedeKeySpec(keyBytes);
SecretKey key=SecretKeyFactory.getInstance(“DESede”).generateScret(keySpec);
Cipher Cipher=Cipher.getInstance(“DESede”);
cipher.init(cipher.ENCRYPT_模式,密钥);
字节[]明文字节=message.getBytes(“utf-8”);
byte[]buf=cipher.doFinal(明文字节);
字节[]base64Bytes=Base64.encodeBase64(buf);
String base64EncryptedString=新字符串(base64字节);
返回base64EncryptedString;
}
iOS代码

    + (NSData*)transformData:(NSData*)inputData operation:(CCOperation)operation withPassword:(NSString*)password
{
    NSData* key = [self keyFromPassword:password];
    //NSData* iv = [self ivFromPassword:password];
    NSMutableData* outputData = [NSMutableData dataWithLength:(inputData.length + kCCBlockSize3DES)];

    size_t outLength;
    CCCryptorStatus result = CCCrypt(operation, kCCAlgorithm3DES, kCCAlgorithmDES, key.bytes, key.length, nil, inputData.bytes, inputData.length, outputData.mutableBytes, outputData.length, &outLength);


    if (result != kCCSuccess)
        return nil;

    [outputData setLength:outLength];

    return outputData;
}

+ (NSData*)keyFromPassword:(NSString*)password
{
    NSString* key = [password copy];
    int length = kCCKeySize3DES;

    while (key.length < length)
        key = [key stringByAppendingString:password];

    if (key.length > length)
        key = [key substringToIndex:length];

    return [key dataUsingEncoding:NSUTF8StringEncoding];
}

+ (NSData*)ivFromPassword:(NSString*)password
{
    NSString* key = [password copy];
    int length = 8;

    while (key.length < length)
        key = [key stringByAppendingString:password];

    if (key.length > length)
        key = [key substringToIndex:length];

    return [key dataUsingEncoding:NSUTF8StringEncoding];
}
+(NSData*)转换数据:(NSData*)输入数据操作:(cOperation)带密码操作:(NSString*)密码
{
NSData*key=[self-keyFromPassword:password];
//NSData*iv=[self-ivFromPassword:password];
NSMutableData*outputData=[NSMutableData dataWithLength:(inputData.length+kCCBlockSize3DES)];
尺寸超过长度;
CCCryptorStatus result=CCCrypt(operation,kCCAlgorithm3DES,kCCAlgorithmDES,key.bytes,key.length,nil,inputData.bytes,inputData.length,outputData.mutableBytes,outputData.length,&outLength);
如果(结果!=kCCSuccess)
返回零;
[outputData setLength:outLength];
返回输出数据;
}
+(NSData*)keyFromPassword:(NSString*)密码
{
NSString*密钥=[密码副本];
int length=kCCKeySize3DES;
while(key.lengthlength)
key=[key substringToIndex:length];
返回[key dataUsingEncoding:NSUTF8StringEncoding];
}
+(NSData*)ivFromPassword:(NSString*)密码
{
NSString*密钥=[密码副本];
整数长度=8;
while(key.lengthlength)
key=[key substringToIndex:length];
返回[key dataUsingEncoding:NSUTF8StringEncoding];
}
请注意,所使用的密钥是一个20字节的密钥,这可能会有所帮助。我被限制为20字节的密钥。android应用程序通过Array.copyOf函数自动解决了这一限制,但是,尽管使用零填充并重复密钥的前八个字符作为最后八个字符,我仍然无法在iOS中复制输出


任何帮助都将不胜感激。

这是通过查看实际内存并将其与其他设备的十六进制值进行比较来进行调试的最佳方法,您可以在iOS中的断点处通过选择Xcode底部窗格中的变量并选择“查看内存”来完成。我将查看您正在使用的键和iv的实际十六进制数据,这将帮助您快速找到差异。(另外,尽管是一个20字节的键,我还是看不到代码中的数字20。也许你可以把它作为参数传递进来?)感谢Owen,通过仔细检查,我意识到在Android上所做的是去掉最后4个字节,并重复前8个字符作为最后8个字符。然而,我仍然在iOS中得到一个不同的加密字符串。我没有使用iv,因为Android代码也没有使用iv。有多个加密/解密免费网站,您可以在其中键入密钥和一些明文,然后输出密文。使用一些示例数据执行此操作,然后查看这两个设备中的哪一个输出正确的密码文本,并更正另一个设备的代码。