openssl 相关问题

OpenSSL是一个实现SSL / TLS协议的开源软件工具包,以及一般的加密库。

使用 OpenSSL API 的内存泄漏

我正在运行一个处理超过 500 个连接的 DTLS 服务器,每次关闭一些连接时,我都会看到内存利用率增加。 我想知道我的以下方法是否存在内存泄漏...

回答 1 投票 0

Valgrind 报告与 C++ 应用程序中的 CRYPTO_zalloc 相关的内存泄漏,但没有其他信息

我在arm嵌入式板上创建了一个c ++应用程序。该板使用 armbian linux debian 风格。这个应用程序在 poco NetSSl 库的帮助下在多个地方执行 https 请求。 当我运行 valgr...

回答 1 投票 0

“x509:证书对任何名称都无效”,尽管 openssl 显示正确

我正在按照docker书籍使用SSL配置Docker Engine API,以下是整个过程: #CA 回声 01 |须藤三通有限公司 sudo openssl genrsa -des3 -out ca-key.pem sudo openssl req -new -x509...

回答 2 投票 0

如何使用 OpenSSL 创建和信任 SSL 证书?

如何使用 OpenSSL 创建有效的证书以在 IIS 中使用 HTTPS 绑定? 它必须在 Firefox 和所有其他浏览器中工作 我正在使用 IIS 10。我希望 HTTPS 绑定能够在所有模式下工作...

回答 1 投票 0

ssh-ed25519 字符串到java中的公钥

我在密码学方面几乎是新手,并且在将 ed25519 公钥字符串加载到 java.security.PublicKey 中时遇到问题。当我使用 openssl 尝试密钥时它有效,但当我加载密钥时则无效

回答 1 投票 0

Openssl ECDSA:私钥密码

我是 Openssl 的新手,我已经生成了私钥 myprivatekey.pem 和公钥 mypublickey.pem,其中: openssl ecparam -genkey -名称 secp160k1 -noout -out myprivatekey.pem 和我的公钥...

回答 3 投票 0

如何使用#include <openssl/sha.h>库编译C程序?

我的任务是创建一个登录系统,我的团队计划在其中以 SHA-256 加密方式存储用户凭据。我已经创建了代码并在我的笔记本电脑上安装了 OpenSSL 库。我只是...

回答 2 投票 0

Perl Crypt::OpenSSL::RSA 加载私钥时失败,并出现令人困惑的错误消息

我正在尝试使用 Crypt::OpenSSL::RSA 使用公钥加密文件,然后使用相应的私钥(当前我在提示时输入)对其进行解密。我的加密程序有效...

回答 1 投票 0

我可以重新生成具有不同主题/颁发者字符串属性顺序的公共证书吗?

我想知道是否可以使用相同的公钥(对于私钥)生成新证书并更改颁发者/主题字符串中属性的顺序? 这是关于...

回答 1 投票 0

C 中的 x509 证书验证

我确实有 DER 和 PEM 格式的证书,我的目标是检索颁发者和主题的字段并使用 CA 公钥验证证书,同时使用...验证 CA 证书

回答 3 投票 0

如何在 React js 中解密 Laravel Open SSL 加密的文本?

我想解密由laravel使用open ssl加密的文本,这是laravel代码 类加密 { 私有字符串 $encryptMethod = 'AES-256-CBC'; 私有字符串$key; 私人

回答 1 投票 0

需要帮助在 ubuntu 16.04 上调试 openssl(无法更改 ISRG Root X1 的根证书)

(抱歉格式问题,如果不将这篇文章的大部分内容设置为代码,我就无法发布) 我运行的是 ubuntu 16.04。 openssl 声称站点证书已过期。 openssl s_client -con...

回答 1 投票 0

如何在 OpenBMC 中将 OpenSSL 版本从 1.1.1 更新到 3.x.x

我是OpenBMC的初学者。 我使用 OpenBMC 源代码构建了一个映像,但是当我使用“ssh -V”命令时,它仅显示版本 1.1.1。我想将 OpenSSL 更新到版本 3.2.1。怎么...

回答 1 投票 0

如何从 PEM 编码证书确定 SSL 证书到期日期?

如果我有实际文件和 Mac 或 Linux 中的 Bash shell,我如何查询证书文件何时过期?不是网站,而是证书文件本身,假设我有 csr...

回答 12 投票 0

在 Windows 上构建静态 OpenSSL 库

我正在将 OpenSSL 构建为静态库,但链接失败。我正在使用以下命令: perl 配置 VC-WIN64A 非共享 nmake 链接因无法解析的外部而失败(liba...

回答 1 投票 0

将OpenSSL生成的私钥导入Oracle Wallet

我有一个根据 OpenSSL 证书签名请求创建的私钥。 CA 已接受 CSR 并给了我证书。当我尝试使用 orapki 导入 Oracle Wallet 时,我得到

回答 3 投票 0

openssl:EVP_PKEY_derive 失败

我尝试测试 https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_CTX_set1_hkdf_salt.html 中的示例代码(经过一些修改)。当我运行它时,EVP_PKEY_derive 的函数调用返回...

回答 1 投票 0

如何将openssl加密解密转换成php

我正在尝试将以下 shell 命令转换为 php,但我没有得到正确的结果 $key = 'my_key'; $cmd =“echo -n $plaintext| openssl enc -e -aes-256-cbc -a -k $key -md md5&

回答 1 投票 0

如何告诉 OpenSSL 3.0.2 加载特定的 fips.dll?

加载 fips.dll 时,它当前正在从这个疯狂的构建位置加载 DLL: C:\Users\John\.conan\data\openssl .0.2\_\_\packag

回答 0 投票 0

Delphi (FMX):Windows 中的 DCPCrypt2 在 Android/IOS 中产生不同的结果

我正在尝试编写一个函数,该函数在 Delphi (RAD Studio 10.2) 中返回与 PHP 中的以下代码相同的结果: 我正在尝试编写一个在 Delphi (RAD Studio 10.2) 中返回与 PHP 中的以下代码相同的结果的函数: <?php $method = 'AES-256-CTR'; $data = 'Hello, world!'; $key = 'bRuD5WYw5wd0rdHR9yLlM6wt2vteuini'; $vector = 'bf49ea9d61104d8c'; $crypt = openssl_encrypt($data, $method, $key, 0, $vector); echo $crypt; ?> 我在 Pascal 中提出了这个函数(使用 David Barton 编写的 DCPcrypt v2.1 库): procedure TMainForm.Encrypt1ButtonClick(Sender: TObject); var Cipher: TDCP_rijndael; Key, Vector: RawByteString; Data, Crypt: RawByteString; begin Data := 'Hello, world!'; SetLength(Crypt, Length(Data)); Key := 'bRuD5WYw5wd0rdHR9yLlM6wt2vteuini'; Vector := 'bf49ea9d61104d8c'; Cipher := TDCP_rijndael.Create(nil); try Cipher.Init(Key[1], 256, @Vector[1]); Cipher.EncryptCTR(Data[1], Crypt[1], Length(Data)); finally Cipher.Free; end; EncryptEdit.Text := DCPBase64.Base64EncodeStr(Crypt); end; 这确实有效(在 Windows 中)。 PHP 和 Pascal 都返回:pEP16OOxov9QDfraIg== 但是,如果我为 Android 编译相同的代码并在平板电脑上运行它,我会得到非常不同的结果。这是为什么? 我确实阅读了有关转换 fmx 代码的文档,特别是处理字符串处理的内容,但我仍然不明白为什么。即使 RawByteString 是基于 0 而不是基于 1,我仍然会得到差异(尝试使用 [0] 而不是 [1])。 RawByteString 没有附加代码页,对吧?所以这个问题不可能是由某些字符串转换引起的(我认为)。那么这是怎么回事? 经过3天的努力,我终于成功了。关键是完全消除字符串的使用,并且仅使用 DCPCrypt 中基于 TByte 的例程。 下面的代码是一个测试程序,用于测试 DCPCrypt 支持的所有不同链接模式。我还添加了一个函数来实现我在这里找到的四种填充模式(与 CBC 和 ECB 一起使用): https://en.wikipedia.org/wiki/Padding_(密码学) 以及零填充和随机填充。 我选择不使用 DCPCrypt 自己的 Base64 函数,因为它们与 FMX 不兼容。相反,我使用 System.NetEncoding 单元中的对应项。 拜托,我认为自己只是一个普通的程序员,所以我希望你们当中真正的 Delphi 奇才能够找到很多可以批评的地方。但没关系。如果给出良好的反馈,我将调整代码。 现在,代码可以运行并生成与 PHP 的 openssl 函数兼容的结果(使用 CTR 模式进行测试)。我只是在这里发布此内容,希望它对寻找与我相同的解决方案的人有用。 unit MainUnit; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.NetEncoding, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Layouts, FMX.ScrollBox, FMX.Memo, FMX.Edit, FMX.Controls.Presentation, DCPcrypt2, DCPsha256, DCPblockciphers, DCPrijndael; type TChainingMode = (cmCBC, cmCFB8bit, cmCFBblock, cmOFB, cmCTR, cmECB); TPaddingMode = (pmZeroPadding, pmANSIX923, pmISO10126, pmISO7816, pmPKCS7, pmRandomPadding); type TMainForm = class(TForm) ScrollBox: TScrollBox; KeySizeLabel: TLabel; ChainingLabel: TLabel; EncodingLabel: TLabel; PaddingLabel: TLabel; KeyLabel: TLabel; InitVectorLabel: TLabel; DataLabel: TLabel; DecryptedLabel: TLabel; CipherLabel: TLabel; EncryptedLabel: TLabel; rbRijndael: TRadioButton; rb128bit: TRadioButton; rb256bit: TRadioButton; rbANSI: TRadioButton; rbUTF8: TRadioButton; rbUnicode: TRadioButton; rbCBC: TRadioButton; rbOFB: TRadioButton; rbCTR: TRadioButton; rbECB: TRadioButton; rbCFB8bit: TRadioButton; rbCFBblock: TRadioButton; rbZeroPadding: TRadioButton; rbANSIX923: TRadioButton; rbISO10126: TRadioButton; rbISO7816: TRadioButton; rbPKCS7: TRadioButton; rbRandomPadding: TRadioButton; KeyEdit: TEdit; InitVectorEdit: TEdit; DataMemo: TMemo; EncryptedMemo: TMemo; DecryptedMemo: TMemo; EncryptButton: TButton; DecryptButton: TButton; procedure FormCreate(Sender: TObject); procedure EncryptButtonClick(Sender: TObject); procedure DecryptButtonClick(Sender: TObject); public procedure GetOptions(var Key: TBytes; var KeySize: integer; var InitVector: TBytes; var Encoding: TEncoding; var ChainingMode: TChainingMode; var PaddingMode: TPaddingMode); end; var MainForm: TMainForm; implementation {$R *.fmx} {$R *.LgXhdpiPh.fmx ANDROID} function BytesToHex(B: TBytes): string; var I: integer; begin Result := ''; for I := Low(B) to High(B) do Result := Result + IntToHex(B[I]) + ' '; end; procedure BytePadding(var Data: TBytes; BlockSize: integer; PaddingMode: TPaddingMode); // Supports: ANSI X.923, ISO 10126, ISO 7816, PKCS7, zero padding and random padding var I, DataBlocks, DataLength, PaddingStart, PaddingCount: integer; begin BlockSize := BlockSize div 8; // convert bits to bytes // Zero and Random padding do not use end-markers, so if Length(Data) is a multiple of BlockSize, no padding is needed if PaddingMode in [pmZeroPadding, pmRandomPadding] then if Length(Data) mod BlockSize = 0 then Exit; DataBlocks := (Length(Data) div BlockSize) + 1; DataLength := DataBlocks * BlockSize; PaddingCount := DataLength - Length(Data); // ANSIX923, ISO10126 and PKCS7 store the padding length in a 1 byte end-marker, so any padding length > $FF is not supported if PaddingMode in [pmANSIX923, pmISO10126, pmPKCS7] then if PaddingCount > $FF then Exit; PaddingStart := Length(Data); SetLength(Data, DataLength); case PaddingMode of pmZeroPadding, pmANSIX923, pmISO7816: // fill with $00 bytes FillChar(Data[PaddingStart], PaddingCount, 0); pmPKCS7: // fill with PaddingCount bytes FillChar(Data[PaddingStart], PaddingCount, PaddingCount); pmRandomPadding, pmISO10126: // fill with random bytes for I := PaddingStart to DataLength-1 do Data[I] := Random($FF); end; case PaddingMode of pmANSIX923, pmISO10126: Data[DataLength-1] := PaddingCount; // set end-marker with number of bytes added pmISO7816: Data[PaddingStart] := $80; // set fixed end-markder $80 end; end; procedure EncryptAES(const Data: TBytes; var Crypt: TBytes; const Key: TBytes; KeySize: integer; const InitVector: TBytes; ChainingMode: TChainingMode; PaddingMode: TPaddingMode); overload; var Cipher: TDCP_rijndael; begin Cipher := TDCP_rijndael.Create(nil); try Cipher.Init(Key[0], KeySize, @InitVector[0]); // Copy Data => Crypt Crypt := Copy(Data, 0, Length(Data)); // Padd Crypt to required length (for Block based algorithms) if ChainingMode in [cmCBC, cmECB] then BytePadding(Crypt, Cipher.BlockSize, PaddingMode); // Encrypt Crypt using the algorithm specified in ChainingMode case ChainingMode of cmCBC: Cipher.EncryptCBC(Crypt[0], Crypt[0], Length(Crypt)); cmCFB8bit: Cipher.EncryptCFB8bit(Crypt[0], Crypt[0], Length(Crypt)); cmCFBblock: Cipher.EncryptCFBblock(Crypt[0], Crypt[0], Length(Crypt)); cmOFB: Cipher.EncryptOFB(Crypt[0], Crypt[0], Length(Crypt)); cmCTR: Cipher.EncryptCTR(Crypt[0], Crypt[0], Length(Crypt)); cmECB: Cipher.EncryptECB(Crypt[0], Crypt[0]); end; finally Cipher.Free; end; end; procedure DecryptAES(const Crypt: TBytes; var Data: TBytes; const Key: TBytes; KeySize: integer; const InitVector: TBytes; ChainingMode: TChainingMode; PaddingMode: TPaddingMode); overload; var Cipher: TDCP_rijndael; I: integer; begin Cipher := TDCP_rijndael.Create(nil); try Cipher.Init(Key[0], KeySize, @InitVector[0]); // Copy Crypt => Data Data := Copy(Crypt, 0, Length(Crypt)); // Decrypt Data using the algorithm specified in ChainingMode case ChainingMode of cmCBC: Cipher.DecryptCBC(Data[0], Data[0], Length(Data)); cmCFB8bit: Cipher.DecryptCFB8bit(Data[0], Data[0], Length(Data)); cmCFBblock: Cipher.DecryptCFBblock(Data[0], Data[0], Length(Data)); cmOFB: Cipher.DecryptOFB(Data[0], Data[0], Length(Data)); cmCTR: Cipher.DecryptCTR(Data[0], Data[0], Length(Data)); cmECB: Cipher.DecryptECB(Data[0], Data[0]); end; // Correct the length of Data, based on the used PaddingMode (only for Block based algorithms) if ChainingMode in [cmCBC, cmECB] then case PaddingMode of pmANSIX923, pmISO10126, pmPKCS7: // these modes store the original Padding count in the last byte SetLength(Data, Length(Data) - Data[Length(Data)-1]); pmISO7816: // this mode uses a fixed end-marker. Find it and correct length accordingly. for I := Length(Data)-1 downto 0 do if Data[I] = $80 then begin SetLength(Data, I); Break; end; end; finally Cipher.Free; end; end; procedure TMainForm.FormCreate(Sender: TObject); begin EncryptedMemo.Lines.Clear; DecryptedMemo.Lines.Clear; end; procedure TMainForm.GetOptions(var Key: TBytes; var KeySize: integer; var InitVector: TBytes; var Encoding: TEncoding; var ChainingMode: TChainingMode; var PaddingMode: TPaddingMode); begin KeySize := 256; Encoding := TEncoding.ANSI; ChainingMode := cmCBC; PaddingMode := pmPKCS7; if rb128bit.IsChecked then KeySize := 128; if rb256bit.IsChecked then KeySize := 256; if rbCBC.IsChecked then ChainingMode := cmCBC; if rbCFB8bit.IsChecked then ChainingMode := cmCFB8bit; if rbCFBblock.IsChecked then ChainingMode := cmCFBblock; if rbOFB.IsChecked then ChainingMode := cmOFB; if rbCTR.IsChecked then ChainingMode := cmCTR; if rbECB.IsChecked then ChainingMode := cmECB; if rbZeroPadding.IsChecked then PaddingMode := pmZeroPadding; if rbANSIX923.IsChecked then PaddingMode := pmANSIX923; if rbISO10126.IsChecked then PaddingMode := pmISO10126; if rbISO7816.IsChecked then PaddingMode := pmISO7816; if rbPKCS7.IsChecked then PaddingMode := pmPKCS7; if rbRandomPadding.IsChecked then PaddingMode := pmRandomPadding; if rbANSI.IsChecked then Encoding := TEncoding.ANSI; if rbUTF8.IsChecked then Encoding := TEncoding.UTF8; if rbUnicode.IsChecked then Encoding := TEncoding.Unicode; Key := Encoding.GetBytes(KeyEdit.Text); InitVector := Encoding.GetBytes(InitVectorEdit.Text); end; procedure TMainForm.EncryptButtonClick(Sender: TObject); var Keysize: integer; Encoding: TEncoding; ChainingMode: TChainingMode; PaddingMode: TPaddingMode; Key, InitVector, Data, Crypt: TBytes; begin GetOptions(Key, KeySize, InitVector, Encoding, ChainingMode, PaddingMode); Data := Encoding.GetBytes(DataMemo.Text); EncryptAES(Data, Crypt, Key, KeySize, InitVector, ChainingMode, PaddingMode); EncryptedMemo.Text := TNetEncoding.Base64.EncodeBytesToString(Crypt); end; procedure TMainForm.DecryptButtonClick(Sender: TObject); var Keysize: integer; Encoding: TEncoding; ChainingMode: TChainingMode; PaddingMode: TPaddingMode; Key, InitVector, Data, Crypt: TBytes; begin GetOptions(Key, KeySize, InitVector, Encoding, ChainingMode, PaddingMode); Crypt := TNetEncoding.Base64.DecodeStringToBytes(EncryptedMemo.Text); DecryptAES(Crypt, Data, Key, KeySize, InitVector, ChainingMode, PaddingMode); DecryptedMemo.Text := Encoding.GetString(Data); end; end. Android 字符串从位置 0 开始。您可以使用 low(Data) 返回字符串的第一个字符,库内部也使用从位置 1 开始的字符串,这不会在 android 或 ios 中运行。对于多平台,我们不应该使用 for i:=1 to length(string) 而应该使用 for l in string 我认为LockBox3应该可以解决你的问题。 我在这里面临着同样的问题,并且想运行您测试应用程序。能提供一下fmx表格的源码吗? 非常感谢!

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.