Arduino(avr)之AES-128 CBC加密和解密

Ciphering doesn't match with others generated with Java or Nodejs · Issue #17 · DavyLandman/AESLib · GitHub

由于AESLib限制,使用了CBC-NoPadding

对应的Arduino代码:

#include <AESLib.h>

const PROGMEM char HEX_VALUES[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

#define CBLOCK (1 * N_BLOCK) + 1

char serialBuffer[120];

void setup() {
	Serial.begin(115200);
}

void loop() {
	crypt();
	delay(10000);
}

void ByteToHexString(char * hexStrParam, unsigned char * byteArrayParam, unsigned int byteArrayLength)
{
	unsigned char num;

	for (int i = 0, u = 0; i < byteArrayLength; i++, u++)
	{
		num = byteArrayParam[i] >> 4;
		hexStrParam[u] = (char)pgm_read_byte(HEX_VALUES + num);
		num = byteArrayParam[i] & 0xf;
		hexStrParam[++u] = (char)pgm_read_byte(HEX_VALUES + num);
	}
}

void crypt() {
	uint8_t key[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
	uint8_t iv[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
	char data[16];
	aes_context ctx;
	char auxBuffer[129];

	memset(data, 0x00, 16);
	memcpy(data, "0123456789012345", 16);

	ctx = aes128_cbc_enc_start((const uint8_t*)key, iv);
	aes128_cbc_enc_continue(ctx, data, 16);
	aes128_cbc_enc_finish(ctx);

	memset(auxBuffer, 0x00, 129);
	ByteToHexString(auxBuffer, (unsigned char *)data, sizeof(data));
	sprintf(serialBuffer, "encrypted-cbc: %s", auxBuffer);
	Serial.println(serialBuffer);

	ctx = aes128_cbc_dec_start((const uint8_t*)key, iv);
	aes128_cbc_dec_continue(ctx, data, 16);
	aes128_cbc_dec_finish(ctx);

	sprintf(serialBuffer, "decrypted-cbc: %s", data);
	Serial.println(serialBuffer);

	memset(auxBuffer, 0x00, 129);
	ByteToHexString(auxBuffer, (unsigned char *)iv, sizeof(iv));
	sprintf(serialBuffer, "iv: %s", auxBuffer);
	Serial.println(serialBuffer);
}

js代码:


<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/sha1.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding-min.js"></script>

<script>


    var key = CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f");
    var iv = key;

    var  message = '0123456789012345'
    var encrypted =  CryptoJS.AES.encrypt(message, key, {'iv': iv,'padding': CryptoJS.pad.NoPadding, 'mode': CryptoJS.mode.CBC});

	console.log('Encrypted: ' + encrypted.ciphertext.toString(CryptoJS.enc.Hex));

    var decrypted = CryptoJS.AES.decrypt(encrypted, key, {'iv': iv,'padding': CryptoJS.pad.NoPadding, 'mode': CryptoJS.mode.CBC});
	console.log('Output: ' + decrypted.toString(CryptoJS.enc.Utf8));


</script>

Java代码:

package test;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AesTest {

	public static void main(String[] args) {
		
		String encrypted = encrypt();
		
		System.out.println(encrypted);
		
	}

	public static String encrypt() {
		try {
			byte key[] = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
			byte iv[] = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

			SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
			cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(iv));

			byte[] encrypted = cipher.doFinal("0123456789012345".getBytes());

			return Hex2Str(encrypted);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;
	}
	

    public  static String Hex2Str(byte[] hexByteIn){
        int len = hexByteIn.length;
        String restult = new String();
        for(int i =0;i<len;i++)
        {
            restult += String.format( "%02x",hexByteIn[i] );
        }
        return restult;
    }


		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值