菜鸟教程小白 发表于 2022-12-12 14:01:10

ios - 加密 8 字节字符串/base64 编码/最大长度 20 字节


                                            <p><div>
            <aside class="s-notice s-notice__info post-notice js-post-notice mb16"role="status">
      <div class="d-flex fd-column fw-nowrap">
            <div class="d-flex fw-nowrap">
                <div class="flex--item wmn0 fl1 lh-lg">
                  <div class="flex--item fl1 lh-lg">
                        <b>关闭</b>。这个问题需要更多 <a href="https://stackoverflow.com/help/closed-questions" rel="noreferrer noopener nofollow">focused</a> .它目前不接受答案。
                        
                  <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>是的。</p>

<p>DES、3DES 和 Blowfish 的 block 大小为 8 字节,因此加密输出将为 8 字节,Base64 编码 8 字节将产生 12 字节。</p>

<p>AES 的 block 大小为 16,因此 8 字节 + 填充将是 16 字节的数据。 Base64 编码 16 字节将产生 24 字节,因此 AES 不起作用。</p>

<p>还有其他问题,例如 CBC 模式和 iv,一个好的方案会使用随机 iv 并将其与加密消息一起传输。可以使用 Base64 中的剩余位来传输部分 iv。但这已经超出了这个问题。</p>

<p>AES 是当前首选的对称加密算法。 DES 不再推荐用于新工作,并且有一些已知的弱 key 。也不推荐河豚,但很多人喜欢它,它可能比 DES 更好。</p>

<p>这是一个使用 8 字节数据和 64 位 key 且没有 iv 的示例。可以通过用 Blowfish 常量替换 3DES 和 24 字节 key 来使用 3DES。这不是推荐的解决方案,一个好的解决方案需要考虑使用情况、所需的安全性、数据值(value)和潜在的攻击者等因素,例如 iv 和 key。</p>

<pre><code>+ (NSData *)doCipher:(NSData *)dataIn
                  iv:(NSData *)iv
               key:(NSData *)symmetricKey
             context:(CCOperation)encryptOrDecrypt
               error:(NSError **)error
{
    CCCryptorStatus ccStatus   = kCCSuccess;
    size_t          cryptBytes = 0;    // Number of bytes moved to buffer.
    NSMutableData*dataOut    = ;

    ccStatus = CCCrypt( encryptOrDecrypt,
                     kCCAlgorithmBlowfish,
                     0,
                     symmetricKey.bytes,
                     kCCKeySizeMinBlowfish,
                     nil,
                     dataIn.bytes, dataIn.length,
                     dataOut.mutableBytes, dataOut.length,
                     &amp;cryptBytes);

    if (ccStatus == kCCSuccess) {
      dataOut.length = cryptBytes;
    }
    else {
      if (error) {
            *error = [NSError errorWithDomain:@&#34;kEncryptionError&#34;
                                       code:ccStatus
                                     userInfo:nil];
      }
      dataOut = nil;
    }

    return dataOut;
}
</code></pre>

<p>测试:
我把上面的方法放到了一个类名<code>Test</code>中。</p>

<pre><code>uint8_t keyBytes[] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18};
NSData *key = ;
uint8_t dateBytes[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
NSData *data = ;
NSLog(@&#34;data:   %@&#34;, data);

NSError *error;
NSData *encryptData = ;
NSString *encryptString = ;
NSLog(@&#34;encryptData:   %@&#34;, encryptData);
NSLog(@&#34;encryptString: %@&#34;, encryptString);

NSData *decryptData = ;
NSLog(@&#34;decryptData:   %@&#34;, decryptData);
</code></pre>

<p>输出:</p>

<pre>数据:01020304 05060708
加密数据:9e8ec0a8 71ab9d10
加密字符串:no7AqHGrnRA=
解密数据 01020304 05060708
</pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 加密 8 字节字符串/base64 编码/最大长度 20 字节,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28289365/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28289365/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 加密 8 字节字符串/base64 编码/最大长度 20 字节