2013-09-17 3 views
2

Просто интересно, почему тот же простой текст, зашифрованный в Java и C, не генерирует такой же шифрованный текст. Для DES алгоритмом я заметилDES encrypt in C/C++ vs Java

вход text = "text", key = "test"

С шифрованный текст len = 24 Java создает шифрованный текст len = 8

Для 256bit AES я заметил подобную разницу
С шифрованный текст len = 32 Java генерирует зашифрованный текст len = 16

вот мой код «C»

char* enc(const char* text, const char* keyStr) 
{ 
    EVP_CIPHER_CTX ctx; 
    unsigned char key[32] = {0}; 
    unsigned char iv[16] = {0}; 
    unsigned char in[16] = {0}; 
    unsigned char out[32]; /* at least one block longer than in[] */ 
    memset(out, 0, 32); 
    int outlen1, outlen2; 

    memcpy(in, text, strlen(text)); 
    memcpy(key, keyStr, strlen(keyStr)); 

    EVP_EncryptInit(&ctx, EVP_aes_256_cbc(), key, iv);  
    EVP_EncryptUpdate(&ctx, out, &outlen1, in, sizeof(in)); 
    EVP_EncryptFinal(&ctx, out + outlen1, &outlen2); 

    char* ret = (char*)malloc(outlen1 + outlen2+1); 
    memset(ret, 0, outlen1 + outlen2+1); 
    memcpy(ret, out, outlen1 + outlen2); 

    EVP_CIPHER_CTX_cleanup(&ctx); 

    return ret; 
} 

Вот «Java» код

public static byte[] enc(byte[] input, byte[] keyStr){ 
     byte[] output = null; 

     try {   
      byte[] newKey = getByteArrays(keyStr, 0, 32); 
      SecretKey secretKey = new SecretKeySpec(newKey, "AES"); 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      //Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
      String ivStr = ""; 
      byte[] ivKey = getByteArrays(ivStr.getBytes("UTF-8"), 0, 16); 
      IvParameterSpec ips = new IvParameterSpec(ivKey); 
      cipher.init(Cipher.ENCRYPT_MODE, secretKey, ips, null);   
      output = cipher.doFinal(input); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  
     return output; 
    } 

У меня есть список записей зашифрован, используя C, я хочу, чтобы расшифровать эти записи в Java.

ОБНОВЛЕНО
следующее обновление помогло получить такую ​​же длину, как в 'C' и 'JAVA'

EVP_EncryptUpdate (& CTX, из, & outlen1, в, STRLEN (текст));

Нет Просто интересно, почему шифротекст возвращаемый «C» и «JAVA» различен для того же текст и ключа, я жду их тоба же

+0

В коде Java вы уверены, что ваш IV - это все нули? Вы уверены, что ваш объект шифрования находится в режиме CBC? – zindorsky

ответ

1

Причины код C выдает 32 байт шифротекста, потому что вы заполняют вашу входную строку нулями до, передавая ее функции шифрования.

В этой строке:

EVP_EncryptUpdate(&ctx, out, &outlen1, in, sizeof(in)); 

функция не имеет ни малейшего представления о том, что вы проложенный данные нулями. Поскольку sizeof(in) равно 16, для вашего открытого текста требуется 16. А с дополнением PKCS5 (и AES) 16 байтов будут помещаться до 32 байтов.

В коде Java вы не вручную вставляете свой ввод, вы просто передали его прямо на функцию шифрования. Таким образом, функция шифрования видит ваш размер открытого текста как 4 байта, который колотит до 16 с дополнением PKCS5.

Итак, ваше решение прост: не вводите вручную свой ввод в код C. Просто передайте текст прямо на EVP_EncryptUpdate. Он уже предназначен для обработки незакрепленного открытого текста.

+0

Спасибо Zindorskey, что помогло – user2787620

+0

Теперь просто интересно, почему зашифрованный текст, возвращаемый «C» и «JAVA», отличается тем же текстом и ключом, я ожидаю, что они будут такими же – user2787620