最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++代碼實現(xiàn)tea加密算法的實例詳解

 更新時間:2020年04月11日 09:23:11   作者:飛刀又見飛刀  
這篇文章主要介紹了c++代碼實現(xiàn)tea加密算法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

通過c++來實現(xiàn)tea加密算法,最終編譯成so文件,以JNI的方式提供給客戶端調用,主要需要解決以下三個問題:

  • 實現(xiàn)tea算法,這都有開源的代碼可以實現(xiàn);
  • 解決padding問題;
  • 密鑰做一個混淆,防止編譯生成的庫文件方便的被逆向拿到;

對于tea的加密算法,有成熟的各語言代碼可以借鑒,下面是C++的實現(xiàn):

static void tea_encrypt(uint32_t *v, uint32_t *k) {
 uint32_t v0 = v[0], v1 = v[1], sum = 0, i;
 uint32_t delta = 0x9e3779b9;
 uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];

 for (i = 0; i < tea_round; i++) {
 sum += delta;
 v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
 v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
 }

 v[0] = v0;
 v[1] = v1;
}

static void tea_decrypt(uint32_t *v, uint32_t *k) {
 uint32_t v0 = v[0], v1 = v[1], sum, i;
 sum = (tea_round == 16) ? 0xE3779B90 : 0xC6EF3720;

 uint32_t delta = 0x9e3779b9;
 uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
 for (i = 0; i < tea_round; i++) {
 v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
 v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
 sum -= delta;
 }

 v[0] = v0;
 v[1] = v1;
}

生成密鑰,并對密鑰做一定的混淆

static uint32_t tea_key[4] = {
 0x34561234, 0x111f3423, 0x34d57910, 0x00989034
};

static uint32_t salt = 0x12031243;
static int tea_round = 16;

//做簡單的混淆
static void confuse_key(uint32_t *key) {
 for (int i = 4; i > 0; i--) {
 key[4 - i] = tea_key[i - 1] ^ salt;
 }
}

最后要實現(xiàn)加密算法的padding,首先思考一個問題,為什么要padding呢?

因為Tea是塊加密算法,8個字節(jié)為一個塊。而在現(xiàn)實的場景中,不會所有的要加密的數(shù)據(jù)都8的倍數(shù)。比如我要加密15,35等字節(jié)該怎么辦?那么這里需要涉及到兩個操作:

  • 加密的時在不足8個字節(jié)的部分進行填充,直至待加密數(shù)據(jù)為8的倍數(shù);
  • 加密時將填充的部分去掉;

那么,填充的數(shù)據(jù)是必須要有一定規(guī)則的,解密的人才知道這部分數(shù)據(jù)是填充的,而非真實的原始數(shù)據(jù)。填充部分必須有包含有表示填充長度的字段。目前比較常用的是PKCS#7填充法;即:

末尾填充的每個字節(jié)均為填充長度

比如填充一個字節(jié)就是: 0x01

填充5個字節(jié)就是: 0x05,0x05,0x05,0x05,0x05;

還有一個問題:

如果加密的字段正好為8的倍數(shù),需不需要padding呢?

答案是也需要的,因為如果沒有padding,解密者可能會把原始數(shù)據(jù)當做padding來解析(如果此時原始數(shù)據(jù)的最后幾位恰好與某種padding編碼相同),那么就解密出錯了。

bool encrypt(const void *input, int input_len, DataBuffer &out) {
 if (input == NULL || input_len <= 0)
 return false;

 unsigned int rest_len = input_len % TEA_BLOCK_SIZE;
 //padding是必須帶的,即便是TEA_BLOCK_SIZE的整數(shù)倍,也要加panding;
 //如果input_len % TEA_BLOCK_SIZE = 0, 正好是8的倍數(shù),那么rest_len = 0; padding_len = TEA_BLOCK_SIZE 補8個字節(jié);
 unsigned int padding_len = TEA_BLOCK_SIZE - rest_len;

 int blocks = (input_len + padding_len) / TEA_BLOCK_SIZE;
 out.expand(blocks * TEA_BLOCK_SIZE);
 out.writeBytes((const void *) input, input_len);

 //放入padding
 for (int i = 0; i < padding_len; i++) {
 out.writeInt8(padding_len);
 }

 uint32_t key[4];
 confuse_key(key);

 uint32_t *data = (uint32_t *) out.getData();
 for (int i = 0; i < blocks; i++) {
 tea_encrypt((uint32_t *) (data + 2 * i), key);
 }

 return true;
}

bool decrypt(const void *input, int input_len, DataBuffer &out) {
 if (input == NULL || input_len < 8)
 return false;

 int blocks = input_len / 8;
 out.expand(blocks * 8);
 out.writeBytes((const void *) input, blocks * 8);

 uint32_t key[4];
 confuse_key(key);

 uint32_t *data = (uint32_t *) out.getData();
 for (int i = 0; i < blocks; i++) {
 tea_decrypt((uint32_t *) (data + 2 * i), key);
 if (i == blocks - 1) {
  //最后一個block,必定包含padding,需要把padding拿出來;
  uint8_t padding_len = ((uint8_t *) (data + 2 * i))[TEA_BLOCK_SIZE - 1];
  out.stripData(padding_len);
 }
 }

 return true;
}

完整的代碼已經(jīng)放到github上。https://github.com/kumustone/...

總結

到此這篇關于c++代碼實現(xiàn)tea加密算法的實例詳解的文章就介紹到這了,更多相關TEA加密算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 最新VScode C/C++ 環(huán)境配置的詳細教程

    最新VScode C/C++ 環(huán)境配置的詳細教程

    這篇文章主要介紹了最新VScode C/C++ 環(huán)境配置的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 使用C++將yolov8 onnx格式轉化為tensorrt格式

    使用C++將yolov8 onnx格式轉化為tensorrt格式

    這篇文章主要為大家詳細介紹了如何使用C++將yolov8 onnx格式轉化為tensorrt格式,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2024-11-11
  • C和MFC巧妙獲取外網(wǎng)IP的兩種實現(xiàn)方法

    C和MFC巧妙獲取外網(wǎng)IP的兩種實現(xiàn)方法

    這篇文章主要介紹了C和MFC巧妙獲取外網(wǎng)IP的兩種實現(xiàn)方法,功能非常的實用,需要的朋友可以參考下
    2014-07-07
  • c++中的自增/自減操作方式

    c++中的自增/自減操作方式

    這篇文章主要介紹了C++中的自增和自減運算符,包括前綴和后綴形式,并通過一個具體的例子解釋了自增/自減表達式的值與函數(shù)參數(shù)傳遞的關系,文章指出,自增/自減表達式的值是在表達式求值時確定的,而不是在自增/自減運算后
    2025-03-03
  • C語言 變量詳解及示例代碼

    C語言 變量詳解及示例代碼

    本文主要介紹C語言 變量,這里整理了C語言 變量的基礎知識,并附有示例代碼和詳細講解,希望能幫助學習C語言的朋友
    2016-08-08
  • 解決scanf_s輸入%d%c%d格式錯誤的問題

    解決scanf_s輸入%d%c%d格式錯誤的問題

    這篇文章主要介紹了解決scanf_s輸入%d%c%d格式錯誤的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言實現(xiàn)密碼本

    C語言實現(xiàn)密碼本

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)密碼本,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++使用ifstream讀取文件內容的示例詳解

    C++使用ifstream讀取文件內容的示例詳解

    這篇文章主要為大家詳細介紹了C++如何使用ifstream讀取文件內容的功能,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的可以了解一下
    2023-03-03
  • 簡單了解C++語言中的二元運算符和賦值運算符

    簡單了解C++語言中的二元運算符和賦值運算符

    這篇文章主要介紹了C++語言中的二元運算符和賦值運算符,文中列出了可重載的運算符列表,需要的朋友可以參考下
    2016-01-01
  • C語言三子棋一步步實現(xiàn)詳程

    C語言三子棋一步步實現(xiàn)詳程

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了,想用c語言做出這個游戲,事實上也是比較簡單的,下面通過c語言進行對五子棋的分析
    2022-02-02

最新評論

泸州市| 油尖旺区| 临澧县| 岳阳市| 元谋县| 巴楚县| 太仓市| 甘孜| 海门市| 广河县| 洱源县| 库车县| 宝清县| 海南省| 华蓥市| 朝阳区| 黎川县| 沂源县| 琼结县| 兰坪| 澄江县| 绩溪县| 阿克| 海伦市| 甘泉县| 林口县| 衡阳县| 望都县| 嘉鱼县| 花莲市| 临沂市| 临高县| 永定县| 丹凤县| 巴彦县| 岳阳县| 荆州市| 醴陵市| 西林县| 黎平县| 乌兰县|