中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. "); //-->

        博客專欄

        EEPW首頁 > 博客 > 數(shù)據(jù)填充規(guī)則之PKCS7

        數(shù)據(jù)填充規(guī)則之PKCS7

        發(fā)布人:電子禪石 時間:2022-03-09 來源:工程師 發(fā)布文章
        數(shù)據(jù)填充規(guī)則之PKCS7

        安全芯片本身支持各種標準的加密算法,用戶可以使用相應(yīng)的算法完成數(shù)據(jù)的加解密、簽名驗簽等功能來完善自己產(chǎn)品的安全性。在數(shù)據(jù)加解密應(yīng)用中,數(shù)據(jù)填充又是其中重要的組成部分。數(shù)據(jù)填充通常有兩個作用一是按要求將數(shù)據(jù)補足到要就的塊長度來滿足加密算法的應(yīng)用需求;二是通過增加填充數(shù)據(jù)來進一步提高密文的安全性。本次主要介紹分組對稱算法中常用的PKCS7。

        PKCS7是當(dāng)下各大加密算法都遵循的填充算法,且 OpenSSL 加密算法默認填充算法就是 PKCS7。PKCS7Padding的填充方式為當(dāng)數(shù)據(jù)長度不足數(shù)據(jù)塊長度時,缺幾位補幾個幾,eg.對于AES128算法其數(shù)據(jù)塊為16Byte(數(shù)據(jù)長度需要為16Byte的倍數(shù)),如果數(shù)據(jù)為”00112233445566778899AA”一共11個Byte,缺了5位,采用PKCS7Padding方式填充之后的數(shù)據(jù)為“00112233445566778899AA0505050505”。

        特別注意的一點是如果是數(shù)據(jù)剛好滿足數(shù)據(jù)塊長度也要在元數(shù)據(jù)后在按PKCS7規(guī)則填充一個數(shù)據(jù)塊數(shù)據(jù),這樣做的目的是為了區(qū)分有效數(shù)據(jù)和補齊數(shù)據(jù)。仍以AES128為例:如果數(shù)據(jù)為”00112233445566778899AABBCCDDEEFF”一共16個符合數(shù)據(jù)塊規(guī)則采用PKCS7Padding方式填充之后的數(shù)據(jù)為

        “00112233445566778899AABBCCDDEEFF10101010101010101010101010101010”


        PKCS7是當(dāng)下各大加密算法都遵循的數(shù)據(jù)填充算法,且 OpenSSL 加密算法簇的默認填充算法就是 PKCS7。
        AES-128, AES-192, AES-256 的數(shù)據(jù)塊長度分別為 128/8=16bytes, 192/8=24bytes, 256/8=32bytes。

        其實PKCS7理解起來非常簡單,使用需填充長度的數(shù)值 paddingSize 所表示的ASCII碼 paddingChar = chr(paddingSize)對數(shù)據(jù)進行冗余填充。

        比如 AES-128的數(shù)據(jù)塊長度是 16bytes,使用PKCS7進行填充時,填充的長度范圍是 1 ~ 16。注意,當(dāng)待加密數(shù)據(jù)長度為 16 的整數(shù)倍時,填充的長度反而是最大的,要填充 16 字節(jié),為什么呢?因為 "PKCS7" 拆包時會按協(xié)議取最后一個字節(jié)所表征的數(shù)值長度作為數(shù)據(jù)填充長度,如果因真實數(shù)據(jù)長度恰好為 16 的整數(shù)倍而不進行填充,則拆包時會導(dǎo)致真實數(shù)據(jù)丟失。

        為什么是冗余填充呢?因為即便你的數(shù)據(jù)長度符合blockSize的整數(shù)倍時,也需要填充,填充的長度反而是最大的,要填充blockSize個char(blockSize)字符在數(shù)據(jù)尾部,這樣犧牲了數(shù)據(jù)長度的做法是為了更為靈活透明的去解包數(shù)據(jù),發(fā)送端和接收端不需要約定好blockSize,接收端總能通過數(shù)據(jù)包的最后一個字符得到填充的數(shù)據(jù)長度。

        當(dāng)我們拿到一串PKCS7填充的數(shù)據(jù)時,取其最后一個字符paddingChar,此字符的ASCII碼的十進制ord(paddingChar)即為填充的數(shù)據(jù)長度paddingSize,讀取真實數(shù)據(jù)時去掉填充長度即可substr(content, 0, -paddingSize)。

        填充示例,比如數(shù)據(jù)塊blockSize為 8

        h<0x07><0x07><0x07><0x07><0x07><0x07><0x07> 7
        he<0x06><0x06><0x06><0x06><0x06><0x06> 6
        hel<0x05><0x05><0x05><0x05><0x05> 5
        hell<0x04><0x04><0x04><0x04> 4
        hello<0x03><0x03><0x03> 3
        hello <0x02><0x02> 2
        hello w<0x01> 1
        hello wo<0x08><0x08><0x08><0x08><0x08><0x08><0x08><0x08> 8 // 數(shù)據(jù)塊
        hello wor<0x07><0x07><0x07><0x07><0x07><0x07><0x07> 7
        hello word<0x06><0x06><0x06><0x06><0x06><0x06> 6

        實現(xiàn):

        /**
         * PKCS7填充
         * @param string $content    待填充內(nèi)容
         * @param int    $block_size 待填充內(nèi)容數(shù)據(jù)塊長度
         */
        function pkcs7_padding($content, $block_size)
        {
            if (255 < $block_size || 0 >= $block_size) {
                throw new \Exception("the block size pkcs7 can padding is (0 ~ 255] ");
            }
        
            // 待填充的長度
            $padding_size = $block_size - (strlen($content) % $block_size);
            // 待填充的字符
            $padding_char = chr($padding_size);
            $content .= str_repeat($padding_char, $padding_size);
        
            return $content;
        }
        
        /**
         * 移除PKCS7
         * @param string $content
         * @return string
         */
        function pkcs7_strip($content)
        {
            $padding_char = substr($content, -1);
            $padding_size = ord($padding_char);
            $content      = substr($content, 0, -$padding_size);
        
            return $content;
        }
        
        $content = pkcs7_padding("hello", $block_size);
        echo pkcs7_strip($content);
        PKCS5

        pkcs5作為pkcs7的子集算法,概念上沒有什么區(qū)別,只是在blockSize上固定為 8 bytes,即數(shù)據(jù)始終會被切割成 8 個字節(jié)的數(shù)據(jù)塊,然后計算需要填充的長度。pkcs7的填充長度blockSize是 1~255 bytes。

        *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: PKCS7

        技術(shù)專區(qū)

        關(guān)閉