- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是在 C/C++ 中实现 RC4 流密码,并确保它产生与使用 openssl
命令时相同的输出。
按照 wikipedia 上的伪代码,
这个实现似乎有效,因为它可以加密和解密内容。
但是,加密输出与等效 openssl
命令的输出不匹配,我想了解原因。
/*
Reference: https://en.wikipedia.org/wiki/RC4
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef u_int8_t byte;
typedef struct
{
byte i;
byte j;
byte S[256];
} Rc4State;
static void swap(byte *a, byte *b)
{
byte temp = *a;
*a = *b;
*b = temp;
}
/*
Set initial permutation.
Initialize i and j counters for stream generation.
*/
void rc4InitState(Rc4State *state, const byte K[256], u_int8_t klen)
{
byte *S = state->S;
for (int i = 0; i < 256; i++)
{
S[i] = i;
}
int j = 0;
for (int i = 0; i < 256; i++)
{
j = (j + S[i] + K[i % klen]) % 256;
swap(&S[i], &S[j]);
}
state->i = 0;
state->j = 0;
}
void rc4Crypt(Rc4State *state, byte buffer[], size_t len)
{
byte *S = state->S;
for (size_t k = 0; k < len; k++)
{
byte i = ++(state->i);
byte j = (state->j += S[i]);
swap(&S[i], &S[j]);
byte t = S[i] + S[j];
buffer[k] ^= S[t];
}
}
int main(int argc, const char *argv[])
{
if (argc < 2)
{
printf("usage: %s secret [-nosalt]\n", argv[0]);
exit(1);
}
const char *key = argv[1];
int klen = strlen(key);
if (!(1 <= klen && klen < 256))
{
printf("secret length must be between 1 and 255 chars, got %d\n", klen);
exit(1);
}
byte *K = new byte[256];
for (int i = 0; i < klen; i++)
{
K[i] = key[i];
}
Rc4State *state = (Rc4State *)malloc(sizeof(Rc4State));
rc4InitState(state, K, klen);
byte *buffer = new byte[256];
while (1)
{
size_t size = fread(buffer, sizeof(byte), 256, stdin);
if (ferror(stdin))
break;
rc4Crypt(state, buffer, size);
fwrite(buffer, sizeof(byte), size, stdout);
if (feof(stdin))
break;
}
}
g++ prog.cpp
g++ --version
是:
$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.29)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
path=path/to/some/file
./a.out foo < "$path" > /tmp/a
openssl rc4 -pass pass:foo -nosalt < "$path" > /tmp/b
cmp /tmp/a /tmp/b
for i in {1..100}; do echo $i; done > /tmp/sample.txt
hexdump
的负责人使用我的实现:
$ ./a.out foo < /tmp/sample.txt | hexdump -C | head
00000000 9a 28 df 23 fb 6b 6f 38 03 80 83 ff aa a4 6b 81 |.(.#.ko8......k.|
00000010 5d 28 e8 a7 bf b1 4d d0 4b 34 3c 65 7c 21 f9 26 |](....M.K4<e|!.&|
00000020 d0 aa 2f 75 e6 96 9c d3 df 64 54 3b 6e 5b cc 47 |../u.....dT;n[.G|
00000030 50 76 23 48 f6 88 f8 c7 88 47 f5 89 4f 3e 01 5b |Pv#H.....G..O>.[|
00000040 e1 b4 f9 03 f3 56 48 9c c2 a1 45 dc a1 ed da ce |.....VH...E.....|
00000050 99 1e d2 ab 65 29 d8 8f 49 a3 bf 88 7c 49 d2 9a |....e)..I...|I..|
00000060 78 f7 ed 04 ec 23 f4 8a 18 06 7d ec 74 90 12 60 |x....#....}.t..`|
00000070 94 f9 a5 9b f8 97 c4 9b 31 94 eb dd 32 66 5e 8a |........1...2f^.|
00000080 03 4d c1 d1 75 b5 89 9b 19 1f 6f 55 39 59 97 78 |.M..u.....oU9Y.x|
00000090 c6 64 81 85 8e 9c b8 0f ef 29 90 77 29 02 0e 93 |.d.......).w)...|
hexdump
的
openssl
的头(在 OSX 上,版本
OpenSSL 1.0.1e 11 Feb 2013
):
$ openssl rc4 -pass pass:foo -nosalt < /tmp/sample.txt | hexdump -C | head
00000000 de c0 1e 94 70 ef f2 55 45 69 f0 c9 71 94 30 32 |....p..UEi..q.02|
00000010 b4 6e fd d5 43 ef 4c 56 a0 58 00 8e f2 33 84 cd |.n..C.LV.X...3..|
00000020 e2 d4 14 3b 78 7c 27 34 1a f2 2c e5 3a c2 9a 6e |...;x|'4..,.:..n|
00000030 ab 20 e5 30 84 4f 17 b5 1a 2f 76 f6 b2 30 48 81 |. .0.O.../v..0H.|
00000040 39 70 50 21 f2 fc dc 0b 11 eb 0e e8 fa 0f ab 7c |9pP!...........||
00000050 02 28 0a 0e 06 8e f6 44 2b 0d 67 c0 88 12 a7 74 |.(.....D+.g....t|
00000060 66 a3 18 b5 f8 ea d4 7b 05 84 cf 56 42 07 0c 8c |f......{...VB...|
00000070 d9 8a c3 fc dc 30 9a ef 4c ca 00 b8 7d 15 32 ac |.....0..L...}.2.|
00000080 7d 3e 54 19 d8 b6 a6 22 d1 14 a1 a4 12 b0 a5 aa |}>T...."........|
00000090 63 e1 63 87 8b a1 58 88 6c 19 3d 32 09 07 0f bf |c.c...X.l.=2....|
openssl
命令在 Debian 系统(版本
OpenSSL 1.1.1c 28 May 2019
)上给出了不同的结果:
$ openssl rc4 -pass pass:foo -nosalt < /tmp/sample.txt | hexdump -C | head
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
00000000 13 b9 ff 0f bf 7e e7 4b 6b 6f 28 86 10 a5 a0 cd |.....~.Kko(.....|
00000010 86 6d 6b d5 58 8e c1 d0 65 3e cd ae b0 c5 64 5f |.mk.X...e>....d_|
00000020 f8 fc 93 76 1e ce c2 d3 8e 1a e1 7d 78 12 ee 3a |...v.......}x..:|
00000030 b1 a8 43 ec c4 fb 06 ed f9 3a fd 8d c7 d9 18 4d |..C......:.....M|
00000040 e5 a4 6a 9e 59 f4 a6 37 b3 0d 6f c8 cb a4 fb 6a |..j.Y..7..o....j|
00000050 31 8a 3a 5e f3 df 41 6f d2 3d 53 aa ee 6f cb 31 |1.:^..Ao.=S..o.1|
00000060 8b 43 e8 f5 45 91 46 4c 15 ab d1 0e 5d 6a 19 90 |.C..E.FL....]j..|
00000070 c7 fc f2 10 89 e3 bb 1d 33 d7 9c 42 70 31 bf 05 |........3..Bp1..|
00000080 e1 dc 91 47 92 a9 d9 da de c3 a1 b3 20 5d c7 d5 |...G........ ]..|
00000090 d1 6f 8e 57 05 f6 6e 87 38 49 bc d8 90 29 9a 4d |.o.W..n.8I...).M|
openssl
实现/版本很重要?
最佳答案
rc4Crypt
来自发布的代码提供与 OpenSSL 相同的密文。关于 OpenSSL,必须考虑以下几点:
-K
设置 key 选项。相比之下,-pass
选项传递从中派生 key 的密码。 rc4
支持 16 字节 key 和 rc4-40
支持 5 字节 key 。与 openssl enc -ciphers
可以列出支持的算法(从版本 1.1.0 开始)。 Plaintext: test
RC4-Key: tests
OpenSSL command: openssl rc4-40 -K 7465737473 -nosalt -p -in plaintext.txt -out ciphertext.txt
Result: DD9B5CB9
Plaintext: AnotherTest
RC4-Key: My16BytesTestKey
OpenSSL command: openssl rc4 -K 4d7931364279746573546573744b6579 -nosalt -p -in plaintext.txt -out ciphertext.txt
Result: 425E42CC1FD9F0E066A227
foo
无法使用 OpenSSL 进行测试,因为不支持此 key 大小。不过可以测试
here .再次
rc4Crypt
返回相同的密文,例如:
Plaintext: AThirdTest
RC4-Key: foo
RC4-Key (hex): 666f6f
Result: EA768540BA050F5745FE
关于c++ - RC4 实现与 openssl 输出不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61167845/
如果我使用open ssl命令 sudo openssl genrsa -out privkey.pem 2048 要生成rsa key ,它仅生成1个文件。这是私钥。我如何获得公钥。 最佳答案 回答
三个不同版本的 openssl 正在同时更新 openssl.org : 0.98, 1.0.0, 1.0.1?它们之间有什么区别,我该如何选择要使用的版本? 最佳答案 https://en.wiki
我有以下命令用于 OpenSSL 生成私钥和公钥: openssl genrsa –aes-128-cbc –out priv.pem –passout pass:[privateKeyPass] 2
我正在尝试使用对应的 gcc (arm-none-eabi-5_4-2016q2) 为 cortex m3 机器交叉编译 openssl。机器应该有能力做 TCP 请求,我们希望在一天结束时做 HTT
我正在尝试使用 openssl dsa 实现,但我对以下细节感到非常困惑: 命令 openssl dsa .... 的选项“-text”:输出中的十六进制数字,我是否正确地假设这些是字节,因此它们是按
我正在尝试制作一个假 CA 并用它签署一个证书以与 stunnel 一起使用(这似乎只是调用 OpenSSL 例程,因此您可能不需要了解该程序来提供帮助:)。然而,stunnel 一直拒绝我的证书,说
不幸的是,Perl 在尝试安装 OpenSSL 的手册页(例如 OpenSSL_1_0_1g)时不知何故遇到了错误。因为我不需要它们 - 我只想使用 OpenSSL 作为 C 库,我想我可以通过完全跳
OpenSSL 中的 BIO 对到底是什么?它的用途是什么?我已经检查过 OpenSSL 文档,但任何细节都很少。 最佳答案 OpenSSL 中的 BIO 类似于文件句柄。您可以使用一对它们来安全地相
openssl ca 和 openssl x509 命令有什么区别?我正在使用它来创建和签署我的 root-ca、intermed-ca 和客户端证书,但是 openssl ca 命令不会在证书上注册
如何(如果有的话)为 OpenSSL 定义一个单一的可信证书文件在 Windows(Win-7,OpenSSL 1.0.1c)上使用 SSL_CERT_FILE 环境变量? 各种研究促使我下载了 Mo
我有一个自签名证书,其中显示了列出的基本约束,但从中生成的签名请求不显示这些属性,例如 [v3_req]。我怎样才能让它可见?我正在使用 openssl 生成证书。 场景: 我使用以下方法创建自签名证
这个问题在这里已经有了答案: Check if a connection is TLSv1 vs SSLv3 (SSL_CIPHER_description/SSL_CIPHER_get_name)
是否有更简单的方法来确定在构建 openssl 期间指定的选项,例如当时是否定义了 OPENSSL_NO_SRTP? 我只能从以下方面获得有限的信息: openssl 版本 -a 命令。但是,如果我只
我们正在与 AWS Nitro 合作,仅提供 3 小时的证书。 我们正在寻找一种可以跳过验证中的过期部分并仍然确认证书链有效的方法。 最佳答案 根据 openssl-verify 文档
嗨,我如何在 Easyphp 中启用 openssl,因为我收到错误消息无法发送。Mailer 错误:缺少扩展:opensslTime:使用 phpmailer 时。谢谢 最佳答案 在您的 php.i
我正在尝试以编程方式读取 OpenSSL 警报消息,但无法找到执行此操作的方法。 OpenSSL API 提供如下功能: const char *SSL_alert_type_string(int v
我跑了openssl speed在我的 Ubuntu 计算机上。一些结果: Doing md4 for 3s on 16 size blocks: 9063888 md4's in 3.00s Doi
我编译了带有cryptodev支持(即硬件加速)的OpenSSL,但不幸的是默认引擎仍然是软件。 time openssl speed -evp aes-128-cbc -engine cryptod
我需要从 RedHat Linux 服务器连接到 Microsoft Dynamics CRM 服务器。地址是xxx.api.crm4.dynamics.com。服务器接受 TLSv1 但不接受 1.
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 上个月关闭。 Improve thi
我是一名优秀的程序员,十分优秀!