在文件中生成三重 DES 密钥,并用它来加密消息
Generate a triple DES key in a file, and use it to encrypt a message
我正在学习密码学,我想使用 OpenSSL 命令行生成以 base64 编码的三重 DES 密钥并将生成的密钥保存到文本文件中,然后我想使用此密钥加密短信文件.
我使用标准命令"rand"生成了一个大小为 24 字节的 base64 编码的随机值并将其保存为文本文件中的密钥,但我不知道如何使用该文件来使用命令 "enc" 加密短信,我想知道是否有更好的方法使用 OpenSSL 命令行生成三重 DES 密钥。
这不是编程或开发问题,也不是 SO 的主题。它更适合 security.SX 或超级用户。
如果这不是一次性测试(或不是一次性测试),那么在文件中以明文形式保存密钥可能是不安全的。那部分真的属于security.SX。
从技术上讲,三重 DES 密钥(类似于过时前几年的单 DES 密钥)应该将每个八位字节(在现代系统中为字节)的低位设置为奇校验.在 70 年代开发 DES 并通常在使用分立晶体管的专用硬件中实施时,这是一个非常重要的特性。在过去的几十年里,尤其是对于软件而言,这些奇偶校验位通常被忽略。特别是对于 OpenSSL,libcrypto 默认情况下会忽略它们(尽管有一个选项可以设置或检查)并且命令行 enc
使用 libcrypto 默认值。
命令 enc
默认为基于密码的加密,它 从提供的密码中导出 密钥,但可以使用 -K
(大写)十六进制;请参阅手册页。
在 Unix 上,如果您改用 rand -hex
,这会很容易:
openssl rand -hex 24 >key.hex
openssl enc -des-ede3-cbc -K $(cat key.hex) -iv 0123456789ABCDEF -in X -out Y
# see below
在 Windows 这也是可以管理的,但并不那么容易;你需要像
这样的东西
openssl rand -hex 24 >key.hex
for /f %t in ('type key.hex') do set k=%t
rem double the % if used in a batch file
openssl enc -des-ede3-cbc -K %k% -iv 0123456789ABCDEF -in X -out Y
rem ditto
如果你坚持使用 base64,你将需要一个 Unix 上的辅助程序
openssl rand -base64 24 >key.b64
K=$( openssl base64 -d <key.b64 | xxd -p )
openssl enc -des-ede3-cbc -K $K ... # as above
而且我认为根本无法在 Windows 上完成。
请注意,每次加密的 IV 都应该不同,而不是像我的示例中那样硬编码,特别是对于 CBC,它也应该是对手无法预测的;这通常最容易通过使其随机化来完成。尽管如果不是 CBC 模式只会对主动攻击者失去安全性,而如果它在 CTR 和 OFB 等所有其他模式下重复,甚至对被动攻击者也会失去安全性。这部分属于 security.SX 或 crypto.SX 那里已经有几十个甚至数百个关于它的问题。
我正在学习密码学,我想使用 OpenSSL 命令行生成以 base64 编码的三重 DES 密钥并将生成的密钥保存到文本文件中,然后我想使用此密钥加密短信文件.
我使用标准命令"rand"生成了一个大小为 24 字节的 base64 编码的随机值并将其保存为文本文件中的密钥,但我不知道如何使用该文件来使用命令 "enc" 加密短信,我想知道是否有更好的方法使用 OpenSSL 命令行生成三重 DES 密钥。
这不是编程或开发问题,也不是 SO 的主题。它更适合 security.SX 或超级用户。
如果这不是一次性测试(或不是一次性测试),那么在文件中以明文形式保存密钥可能是不安全的。那部分真的属于security.SX。
从技术上讲,三重 DES 密钥(类似于过时前几年的单 DES 密钥)应该将每个八位字节(在现代系统中为字节)的低位设置为奇校验.在 70 年代开发 DES 并通常在使用分立晶体管的专用硬件中实施时,这是一个非常重要的特性。在过去的几十年里,尤其是对于软件而言,这些奇偶校验位通常被忽略。特别是对于 OpenSSL,libcrypto 默认情况下会忽略它们(尽管有一个选项可以设置或检查)并且命令行
enc
使用 libcrypto 默认值。命令
enc
默认为基于密码的加密,它 从提供的密码中导出 密钥,但可以使用-K
(大写)十六进制;请参阅手册页。
在 Unix 上,如果您改用 rand -hex
,这会很容易:
openssl rand -hex 24 >key.hex
openssl enc -des-ede3-cbc -K $(cat key.hex) -iv 0123456789ABCDEF -in X -out Y
# see below
在 Windows 这也是可以管理的,但并不那么容易;你需要像
这样的东西 openssl rand -hex 24 >key.hex
for /f %t in ('type key.hex') do set k=%t
rem double the % if used in a batch file
openssl enc -des-ede3-cbc -K %k% -iv 0123456789ABCDEF -in X -out Y
rem ditto
如果你坚持使用 base64,你将需要一个 Unix 上的辅助程序
openssl rand -base64 24 >key.b64
K=$( openssl base64 -d <key.b64 | xxd -p )
openssl enc -des-ede3-cbc -K $K ... # as above
而且我认为根本无法在 Windows 上完成。
请注意,每次加密的 IV 都应该不同,而不是像我的示例中那样硬编码,特别是对于 CBC,它也应该是对手无法预测的;这通常最容易通过使其随机化来完成。尽管如果不是 CBC 模式只会对主动攻击者失去安全性,而如果它在 CTR 和 OFB 等所有其他模式下重复,甚至对被动攻击者也会失去安全性。这部分属于 security.SX 或 crypto.SX 那里已经有几十个甚至数百个关于它的问题。