CC2538之TinyOS例程实验:6-CCM(AES)实验

14 篇文章 1 订阅
11 篇文章 1 订阅

本例程参考TI cc2538_foundation_firmware_1_0_1_0\driverlib\cc2538\examples\ccm例程修改而来;

创建c文件,和第五部做法一样,TinyOS直接使用C文件;

cc2538_ccm.h文件

#ifndef CC2538AES_CCM_H
#define CC2538AES_CCM_H
#ifdef CC2538_HW_SECURITY 


#define AUTHENTICATION_LENTH     0X4    
typedef struct
{
    uint8_t  ui8CCMKey[16];             // Key
    uint8_t  ui8CCMMval;                // length of authentication
    uint8_t  ui8CCMN[13];               // Nonce
    uint8_t* ui8CCMA;                   // Additional data
    uint8_t* ui8CCMInPut;               // input message
    uint16_t ui16CCMInPutLen;           // length of message
    uint16_t ui16CCMLenA;               // length of additional data
    uint8_t  ui8CCMKeyLocation;         // location in Key RAM
    uint8_t  ui8CCMCstate[AUTHENTICATION_LENTH];           // authentication Tag
    uint8_t  ui8CCMLVal;             //  Lval for ccm
    uint8_t  ui8CCMIntEnable;           // set to true to enable interrupts
} sCCM_Config;

int CC2538cb_CCMEncrypt(uint8_t* input, uint8_t len);
int CC2538cb_CCMDecrypt(uint8_t* input, uint8_t len);

#endif
#endif

cc2538_ccm.c文件:


#include "aes.h"
#include "ccm.h"
#include <string.h>
#include "sys_ctrl.h"
#include "cc2538_ccm.h"
#ifdef CC2538_HW_SECURITY 

sCCM_Config sCCC_config =
{
     // example case len_a and Mval = 0
        // key
        { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
        // Mval
        AUTHENTICATION_LENTH,
        // N Nonce
        { 0x00, 0x00, 0xf0, 0xe0, 0xd0, 0xc0, 0xb0, 0xa0,
        0x00, 0x00, 0x00, 0x00, 0x05 },
        // A
        NULL,
        // M message
        NULL,
        // len_m
        0,
        // len_a
        0x0,
        // key location
        0,
        // mic
        { 0x11, 0x22, 0x33, 0x44},
        // Lval
        2,
        false
    
};


                         
int CC2538cb_CCMEncrypt(uint8_t* input, uint8_t len){
      ...
}

int CC2538cb_CCMDecrypt(uint8_t* input, uint8_t len){
     
   ...
}

#endif

需要修改key可以修改结构体初始化值;使用需要开启宏定义CC2538_HW_SECURITY

例程目录tinyos-main-release_tinyos_2_1_2\apps\cc2538_Test\TestCCM;大家可以综合前面的nesC的语法讲解来阅读代码:

首先还是Makefile文件;上面介绍了需要开启CC2538_HW_SECURITY;这是因为CCM的使用者是RF射频加密;调试需要抓包状态没有必要加密,加密后wireshark无法

解密出数据的RPL路由等信息了;

COMPONENT=TestCCMAppC
CFLAGS += -DNOT_USE_PRINTFC_BUT_USE_PRINT
CFLAGS += -DCC2538_HW_SECURITY
include $(MAKERULES)


TestCCMAppC.nc文件:

configuration TestCCMAppC{
}
implementation{
  components MainC, TestCCMC; 
  TestCCMC -> MainC.Boot;

}


TestCCMC.nc文件:

/*******************************************************************
 *附加实验1:CCM加密解密实验
 *节点需求数1
 *编译命令make cc2538cb
 *学会使用make中的编译选项 CFLAGS += -DCC2538_HW_SECURITY
 *开启CCM  配置在tos/chip/cc2538/aes的cc2538_ccm.c文件中,设置key
 *在tos/chip/cc2538/aes的cc2538_ccm.h文件中,设置AUTHENTICATION_LENTH长度
 *长度取值去参考tos/chip/fwlib/ccm.c(ccm.h)
 *注意,在后面的网络测试,一旦一个节点开启CCM,其他节点都要开启,否则无法通信
 *通过wireshar抓包可以看到 已加密 不知道密钥 无法解密
 *更多其他加密方式,可以参考TI加密合集(网盘TI源码)
 ********************************************************************/

#include "printf.h"
#include "cc2538_ccm.h"

module TestCCMC{
   uses interface Boot;
}
implementation{

  uint8_t Test_IN[15 + AUTHENTICATION_LENTH];
  /***************************************************
  *启动事件
  ****************************************************/
  event void Boot.booted(){
    uint8_t i;
    //初始化值
    for(i = 0; i < sizeof(Test_IN); i++)
      Test_IN[i] = i;
    printf("原始:");
    for(i = 0; i < sizeof(Test_IN) - AUTHENTICATION_LENTH; i++)
      printf(" %d", Test_IN[i]);
    printf("\n");
    
    // 加密  CCM Authentication + Encryption
    CC2538cb_CCMEncrypt(Test_IN, sizeof(Test_IN) - AUTHENTICATION_LENTH);
    printf("加密:");
    for(i = 0; i < sizeof(Test_IN); i++)
      printf(" %d", Test_IN[i]);
    printf("\n");
    // 解密   CCM Inverse Authentication + Decryption
    CC2538cb_CCMDecrypt(Test_IN, sizeof(Test_IN));
    printf("解密:");
    for(i = 0; i < sizeof(Test_IN) - AUTHENTICATION_LENTH; i++)
      printf(" %d", Test_IN[i]);
    printf("\n");

  }

}

结合之前的知识,大家发现;TinyOS使用C文件和C语言使用c文件没有区别;例程比较简单,加密一个数组长度为15个字节;大家可以测试加密其他长度,初值可以自己设定!

下面是运行截图:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.古典密码算法之 替代算法 import java.io.*; public class Caesar { //向右加密方法 ming为明文 mi 为密文 yao为密钥 public static void encode(String ming, int yao) { String mi = ""; for(int i=0; i<ming.length(); i++){ if (ming.charAt(i) == 32) mi += (char)(32); else if (ming.charAt(i) >= 'a' && ming.charAt(i) <= 'z') mi += (char)('a' + ((ming.charAt(i) - 'a' + yao) % 26)); else if (ming.charAt(i) >= 'A' && ming.charAt(i) <= 'Z') mi += (char)('A' + ((ming.charAt(i) - 'A' + yao) % 26)); else if (ming.charAt(i) >= '0' && ming.charAt(i) <= '9') mi += (char)('0' + ((ming.charAt(i) - '0' + yao) % 10)); } System.out.println("密文为: " + mi); } /* * 2.古典密码算法之 置换算法 * */ public class Change { //当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR private final static int CRYPT_OK = 1; private final static int CRYPT_ERROR = 0; /* * @param initCode 没有加密前的字符串 * @CRYPT_OK 加密成功 * @CRYPT_ERROR 加密失败 */ public static int encrypt(String initCode) throws Exception{ //用来输出加密后的字符 StringBuilder sb = new StringBuilder(); //获取initCode的字符串长度 int codeLength = initCode.length(); //根据这个codeLength来确定要几行6列 int rows = (int)Math.ceil(codeLength/6.0 ); //构造一个rows行6列的数组 char[][] initChar = new char[rows][6]; //存放initCode中的所有字符,包括空格 for(int i = 0; i < initChar.length; i++ ) for(int j=0; j < initChar[0].length; j++){ //将对应字符放入这个数组中 try{ initChar[i][j] = initCode.charAt( (i ) * initChar[0].length + j ); }catch(Exception e){

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值