【发布时间】:2015-05-07 01:59:57
【问题描述】:
我正在使用 java security 和 openssl 来使用 aes-ecb-256 加密特定字符串,但结果并不相同。 有没有实现Rijndael's key schedule 的java 库?
C 代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/aes.h>
using namespace std;
int main(int argc, char** argv) {
AES_KEY aes;
char* key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
unsigned char* input_string;
unsigned char* encrypt_string;
unsigned char* decrypt_string;
unsigned int len; // encrypt length (in multiple of AES_BLOCK_SIZE)
unsigned int i;
// check usage
if (argc != 2) {
fprintf(stderr, "%s <plain text>\n", argv[0]);
exit(-1);
}
// set the encryption length
len = 0;
if ((strlen(argv[1]) + 1) % AES_BLOCK_SIZE == 0) {
len = strlen(argv[1]) + 1;
} else {
len = ((strlen(argv[1]) + 1) / AES_BLOCK_SIZE + 1) * AES_BLOCK_SIZE;
}
// set the input string
input_string = (unsigned char*)calloc(len, sizeof(unsigned char));
if (input_string == NULL) {
fprintf(stderr, "Unable to allocate memory for input_string\n");
exit(-1);
}
strncpy((char*)input_string, argv[1], strlen(argv[1]));
if (AES_set_encrypt_key((unsigned char*)key, 256, &aes) < 0) {
fprintf(stderr, "Unable to set encryption key in AES\n");
exit(-1);
}
// alloc encrypt_string
encrypt_string = (unsigned char*)calloc(len, sizeof(unsigned char));
if (encrypt_string == NULL) {
fprintf(stderr, "Unable to allocate memory for encrypt_string\n");
exit(-1);
}
// encrypt
AES_ecb_encrypt(input_string, encrypt_string, &aes, AES_ENCRYPT);
// print
printf("input_string = %s\n", input_string);
printf("encrypted string = ");
for (i=0; i<len; ++i) {
printf("%02X ", encrypt_string[i]);
}
printf("\n");
//printf("decrypted string = %s\n", decrypt_string);
return 0;
}
Java 代码:
public class testMain {
private static byte[] key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".getBytes();
private static byte[] plaintext = "fjaiejrfoi".getBytes();
private static Cipher cipher;
private static byte[] result;
public static void main(String[] args) {
try {
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
SecretKeySpec secretKey = null;
try {
secretKey = makeKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
} catch (InvalidKeyException e) {
e.printStackTrace();
}
try {
result = cipher.doFinal(plaintext);
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
StringBuffer sb = new StringBuffer();
for(byte b : result) {
sb.append(Integer.toHexString((int)(b&0xff)));
}
System.out.println("result is " + sb.toString());
}
private static SecretKeySpec makeKey() throws NoSuchAlgorithmException{
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(256, new SecureRandom(key));
SecretKey secretKey = kgen.generateKey();
SecretKeySpec keySpec = new SecretKeySpec(secretKey.getEncoded(), "AES");
return keySpec;
}
}
纯文本是 fjaiejrfoi。两段代码的结果不同。
【问题讨论】:
-
您到底希望实现什么?使用 AES 加密纯文本?
-
Java 和 openssl 都支持 ecb 模式下的 256 位密钥的 aes。显示您的代码。
-
我已经更新了代码。
-
AES 是具有 128 位块的 Rijndael(Rijndael 还提供 192 位和 256 位块,而 AES 不提供)。 AES 使用 Rijndael 的密钥调度。
-
“是否有任何用于实现 Rijndael 密钥调度的 java 库?” - 这是在 Stack Overflow 上提出的错误问题。请参阅帮助中心的 What topics can I ask about here? 和 What types of questions should I avoid asking?。