java–AES加密Android < - > iOS不同的结果,消息长度> 15字节

java–AES加密Android < - > iOS不同的结果,消息长度> 15字节,第1张

概述我在理解两个设备上的密码/加密器时遇到了一个真正的问题.1.如果我们使用CipherAES加密iOS和Android上的消息并且字符串的charlength不大于16(例如“abcdefghijklmno”),我们在使用相同的密钥/密码加密后得到相同的结果.2.但是如果需要更长的消息,我们会在iOS和Android上获得不

我在理解两个设备上的密码/加密器时遇到了一个真正的问题.

1.
如果我们使用Cipher AES加密iOS和Android上的消息并且字符串的charlength不大于16(例如“abcdefghijklmno”),我们在使用相同的密钥/密码加密后得到相同的结果.

2.
但是如果需要更长的消息,我们会在iOS和AndroID上获得不同的结果(例如“abcdefghijklmnop”)

我做了很多研究如何为这两种设备获得相同的参数,起初我认为它是安全的.

这是我用于加密的密码:

public String encode(Context context, String password, String text)        throws nopassgivenException, NoTextGivenException {    if (password.length() == 0 || password == null) {        throw new nopassgivenException("Please give Password");    }    if (text.length() == 0 || text == null) {        throw new NoTextGivenException("Please give text");    }    try {        SecretKeySpec skeySpec = getKey(password);        byte[] clearText = text.getBytes("UTF8");        //important TO GET SAME RESulTS ON iOS and ANDROID        final byte[] iv = new byte[16];        Arrays.fill(iv, (byte) 0x00);        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);        // Cipher is not thread safe                    //EDITED AFTER RIGHT ANSWER FROM                    //*** Cipher cipher = Cipher.getInstance("AES");   ***//                    // TO          Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7padding");        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec);        String encrypedValue = Base64.encodetoString(                cipher.doFinal(clearText), Base64.DEFAulT);        Log.d(TAG, "Encrypted: " + text + " -> " + encrypedValue);        return encrypedValue;    } catch (InvalIDKeyException e) {        e.printstacktrace();    } catch (UnsupportedEnCodingException e) {        e.printstacktrace();    } catch (NoSuchAlgorithmException e) {        e.printstacktrace();    } catch (BadpaddingException e) {        e.printstacktrace();    } catch (NoSuchpaddingException e) {        e.printstacktrace();    } catch (IllegalBlockSizeException e) {        e.printstacktrace();    } catch (InvalIDAlgorithmParameterException e) {        e.printstacktrace();    }    return "";}public SecretKeySpec getKey(String password)        throws UnsupportedEnCodingException {    int keyLength = 128;    byte[] keyBytes = new byte[keyLength / 8];    // explicitly fill with zeros    Arrays.fill(keyBytes, (byte) 0x0);    // if password is shorter then key length, it will be zero-padded    // to key length    byte[] passwordBytes = password.getBytes("UTF-8");    int length = passwordBytes.length < keyBytes.length ? passwordBytes.length            : keyBytes.length;    System.arraycopy(passwordBytes, 0, keyBytes, 0, length);    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");    return key;}

这是我的同事的iOS挂件:

- (NSData *)AES128EncryptWithKey:(Nsstring *)key {    // 'key' should be 32 bytes for AES256,    // 16 bytes for AES256, will be null-padded otherwise    char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused)    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)    // insert key in char array    [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;    // the encryption method, use always same attributes in androID and iPhone (f.e. PKCS7padding)    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,                                          kCCAlgorithmAES128,                                          kCcoptionPKCS7padding,                                          keyPtr,                                          kCCKeySizeAES128,                                          NulL                      /* initialization vector (optional) */,                                          [self bytes], dataLength, /* input */                                          buffer, bufferSize,       /* output */                                          &numBytesEncrypted);    if (cryptStatus == kCCSuccess) {        return [NSData dataWithBytesNocopy:buffer length:numBytesEncrypted];    }    free(buffer);    return nil;}

我真的很想了解差异是什么以及如何避免它.与更大的字符串超过15个字符的测试给了我一个提示,但我不知道为什么:)

先谢谢你们!

解决方法:

检查两个系统上正在使用的填充.不同的填充将导致不同的输出.不要依赖默认值,而是明确设置两侧的填充.您的第二个代码片段显式设置PKCS7填充.在两端使用它.

作为一般规则,不要依赖于不同系统之间的默认值.明确设置IV,模式,填充,随机数或其他任何需要的东西.即使最微小的细节不匹配,加密也会失败.

总结

以上是内存溢出为你收集整理的java – AES加密Android < - > iOS不同的结果,消息长度> 15字节全部内容,希望文章能够帮你解决java – AES加密Android < - > iOS不同的结果,消息长度> 15字节所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1113188.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存