1

我需要 AES 加密(带有初始向量)一个 NSString 值。但是与下面提供的 java 代码相比,它给出了不同的输出。在 Java 中它提供了正确的结果。可能是什么原因?

为此,我使用了以下代码:

iOS


- (NSData *)AES256EncryptWithKey:(NSString *)key 
{
// 'key' should be 32 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)

// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES128 ,
                                      INTIAL_VECTOR /* initialization vector (optional) */,
                                      [self bytes], dataLength, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
    //the returned NSData takes ownership of the buffer and will free it on deallocation
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

free(buffer); //free the buffer;
return nil;
}
- (NSString*)hexStringFromData:(NSData *)data
{
unichar* hexChars = (unichar*)malloc(sizeof(unichar) * (data.length*2));
unsigned char* bytes = (unsigned char*)data.bytes;
for (NSUInteger i = 0; i < data.length; i++) {
    unichar c = bytes[i] / 16;
    if (c < 10) c += '0';
    else c += 'a' - 10;
    hexChars[i*2] = c;
    c = bytes[i] % 16;
    if (c < 10) c += '0';
    else c += 'a' - 10;
    hexChars[i*2+1] = c;
}
NSString* retVal = [[NSString alloc] initWithCharactersNoCopy:hexChars
                                                       length:data.length*2
                                                 freeWhenDone:YES];
return [retVal autorelease];
}

实现片段是:

NSData *InputData = [@"mahi" dataUsingEncoding:NSUTF8StringEncoding];   
NSData *encryptedData = [InputData AES256EncryptWithKey:ENCRYPTION_KEY];   
NSString *encryptedHexString = [self hexStringFromData:encryptedData];
NSLog(@"Encrypted HexString : %@",encryptedHexString);

爪哇

import java.security.NoSuchAlgorithmException;


    import javax.crypto.Cipher;

    import javax.crypto.NoSuchPaddingException;

    import javax.crypto.spec.IvParameterSpec;

    import javax.crypto.spec.SecretKeySpec;


    public class MCrypt {


            private String iv = "fedcba9876543210";

            private IvParameterSpec ivspec;
            private SecretKeySpec keyspec;

            private Cipher cipher;

            private String SecretKey = "0123456789abcdef";


            public MCrypt()
            {

                    ivspec = new IvParameterSpec(iv.getBytes());


                    keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");


                    try {
                            cipher = Cipher.getInstance("AES/CBC/NoPadding");

                    } catch (NoSuchAlgorithmException e) {

                            // TODO Auto-generated catch block
                            e.printStackTrace();

                    } catch (NoSuchPaddingException e) {

                            // TODO Auto-generated catch block
                            e.printStackTrace();

                    }
            }

            public byte[] encrypt(String text) throws Exception

            {
                    if(text == null || text.length() == 0)

                            throw new Exception("Empty string");


                    byte[] encrypted = null;


                    try {
                            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);


                            encrypted = cipher.doFinal(padString(text).getBytes());

                    } catch (Exception e)

                    {                       
                            throw new Exception("[encrypt] " + e.getMessage());

                    }

                    return encrypted;

            }

            public byte[] decrypt(String code) throws Exception

            {
                    if(code == null || code.length() == 0)

                            throw new Exception("Empty string");


                    byte[] decrypted = null;


                    try {
                            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);


                            decrypted = cipher.doFinal(hexToBytes(code));

                    } catch (Exception e)

                    {
                            throw new Exception("[decrypt] " + e.getMessage());

                    }
                    return decrypted;

            }



            public static String bytesToHex(byte[] data)

            {
                    if (data==null)

                    {
                            return null;

                    }

                    int len = data.length;

                    String str = "";

                    for (int i=0; i<len; i++) {

                            if ((data[i]&0xFF)<16)

                                    str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF);

                            else
                                    str = str + java.lang.Integer.toHexString(data[i]&0xFF);

                    }
                    return str;
            }



            public static byte[] hexToBytes(String str) {

                    if (str==null) {

                            return null;
                    } else if (str.length() < 2) {

                            return null;
                    } else {

                            int len = str.length() / 2;

                            byte[] buffer = new byte[len];

                            for (int i=0; i<len; i++) {

                                    buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16);

                            }
                            return buffer;

                    }
            }



            private static String padString(String source)

            {
              char paddingChar = ' ';

              int size = 16;
              int x = source.length() % size;

              int padLength = size - x;


              for (int i = 0; i < padLength; i++)

              {
                      source += paddingChar;

              }

              return source;
            }

    }
4

0 回答 0