openssl 相关问题

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

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

Flutter SecureSocketServer 传输

我在两台设备上运行我的代码,一台服务器一台客户端,我想保护传输,传输正在本地网络中进行(其他人可以监听)。 这就是我创建自签名证书的原因......

回答 1 投票 0

本地开发中的 NET::ERR_CERT_DATE_INVALID (xampp)

我正在尝试修复本地开发的 NET::ERR_CERT_DATE_INVALID 错误。 我正在使用 xampp 设置(PHP 7.4,Windows 10)。 在尝试了一些有关自签名证书的教程后,...

回答 2 投票 0

OpenSSL 在 Python 中用于部分链的命令

我正在尝试在Python中使用OpenSSL模块进行证书验证。 我的 windows openssl 命令为: openssl verify -partial_chain -CAfile Intermediate.pem UserCert.pem 请您建议...

回答 1 投票 0

如何使用openSSL解析JKS(Java KeyStore)文件?

如何使用openSSL解析JKS(Java KeyStore)? 我发现 pkcs12_parse 方法可以解析 p12 文件,但不能解析 jks 文件。

回答 1 投票 0

如何检查 OpenSSL 中的 FIPS 140-2 支持?

我们有一位客户询问 OpenSSL FIPS(联邦信息处理标准)140-2 合规性支持验证的加密使用。如何检查 OpenSSL 是否有 FIPS 投诉

回答 7 投票 0

docker-compose、wsl2 和自签名 ssl 证书

因此,当我在 WordPress 网站上工作时,我使用 docker-compose 来设置本地开发环境。 现在我正在尝试修复,以便我可以获得本地开发环境的自签名 ssl 证书...

回答 5 投票 0

Podspec 对 OpenSSL 的依赖

我正在尝试创建一个依赖于 OpenSSL-Universal 的 Pod。我遇到了一些麻烦,因此作为参考,我查找了具有此类依赖项的其他 pod,并找到了 CoreBitcoin:https://github.com/

回答 1 投票 0

使用OpenSSL递归计算目录中所有文件的SHA256总和

我正在尝试使用 OpenSSL 递归计算目录中所有文件的 SHA256 总和。 这是我的代码: #包括 #包括 #包括 #包括 我正在尝试使用 OpenSSL 递归计算目录中所有文件的 SHA256 总和。 这是我的代码: #include <stdlib.h> #include <stdio.h> #include <dirent.h> #include <string.h> #include <openssl/sha.h> #include <openssl/md5.h> #define _MAX_LINE_ 256 int sha256_file (char* path, char output[65]){ FILE* file = fopen(path, "rb"); unsigned char hash[SHA256_DIGEST_LENGTH]; const int bufSize = 32768; char* buffer = malloc(bufSize); int bytesRead = 0; SHA256_CTX sha256; if(!file) return -1; if(!buffer) return -1; SHA256_Init(&sha256); while((bytesRead = fread(buffer, 1, bufSize, file))){ SHA256_Update(&sha256, buffer, bytesRead); } SHA256_Final(hash, &sha256); sha256_hash_string(hash, output); fclose(file); free(buffer); return 0; } void sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65]){ int i = 0; for(i = 0; i < SHA256_DIGEST_LENGTH; i++){ sprintf(outputBuffer + (i * 2), "%02x", (unsigned char)hash[i]); } outputBuffer[64] = 0; } void traverse_dirs(char* base_path){ char path[_MAX_LINE_]; struct dirent* dp; DIR* dir = opendir(base_path); unsigned char file_sha[65]; char* md5_command; if(!dir) return; while((dp = readdir(dir)) != NULL){ if(strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0){ // calculate the sha256 sum of the file sha256_file(dp->d_name, file_sha); // print the name of the file followed by the sha256 sum printf("%s -> %s\n", dp->d_name, file_sha); strcpy(path, base_path); strcat(path, "/"); strcat(path, dp->d_name); traverse_dirs(path); } } closedir(dir); } int main(int argc, char* argv[]){ if(argc < 2){ printf("Usage: <executable> <dirname>\n"); exit(-1); } traverse_dirs(argv[1]); return 0; } 正如我手动测试的那样,sha256_file()函数为每个文件生成正确的 sha256sum。 traverse_dirs()功能也可以正常工作,因为它可以正确打印所提供目录的内容。 问题是他们不能一起工作。我发现文件在 sha256_file() 函数中无法正确打开(fopen 返回 NULL),但我不明白为什么。如果我在每个文件上手动使用它,它就可以正常工作。 有什么想法吗? 此 sha256_file(dp->d_name, file_sha) 不起作用,因为您不在包含该名称的目录中。您需要使用您在 path[] 中构建的路径。 如果 sha256_file(path) 是常规文件,则应仅调用 path;如果 traverse_dirs(path) 是目录,则应仅调用 path。您可以使用 d_type 检查那些。请参阅 dirent 的手册页。

回答 1 投票 0

在Python中解密ruby DES-EDE3-CBC加密数据

我有一堆数据,通过以下代码在 Ruby 中加密 文本='12345678' 键='6b4f0a29d4bba86add88be9d' cipher = OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt cipher.key = 密钥 s = cip...

回答 1 投票 0

OpenSSL 中的 AES-CTR PRNG 实现具有一致的输出和内存泄漏问题

我正在通过 OpenSSL 使用 AES-CTR 模式为一个旨在安全数据擦除 (nwipe) 的项目实现伪随机数生成器 (PRNG)。我的目标是在...时获得一致的随机数

回答 1 投票 0

openssl:尝试加载本地 ca 存储

我尝试理解CA存储的概念,并用我自己的证书链进行测试,而不影响系统范围。 我的本地主目录下有一个 ca_store 目录,其中一个根目录和一个

回答 1 投票 0

OpenSSL tpm2 提供商。使用 TPM 驻留私钥发出 CSR 的 C++ API

是否可以从 C++ 应用程序实现下面 bash 脚本中显示的功能,可能使用通过以下方式获得的 OpenSSL 提供程序: OSSL_PROVIDER * tpm2_provider = OSSL_PROVIDER...

回答 1 投票 0

使用 openSSL 验证身份验证

bob 创建了一个私钥 openssl genrsa -out Private.pem 1024 然后创建公钥 openssl rsa -in Private.pem -out Public.pem -outform PEM -pubout 他创建了一个名为 d...

回答 1 投票 0

自从 ruby 容器升级以来,我们遇到了很多:`OpenSSL::SSL::SSLError``SSL_read:读取时出现意外的 eof` 问题

因此,当我们升级 ruby alpine 基础容器镜像时,我们看到了很多 OpenSSL::SSL::SSLError SSL_read: Unexpected eof while Reading。据我了解,我们问题背后的主要原因是......

回答 1 投票 0

如何将 OpenSSL v3 二进制文件与 Windows 上的应用程序捆绑在一起?

如何在 Windows 上将 OpenSSL v3 二进制文件与应用程序捆绑在一起? 使用可执行文件,我有 libcrypto-3-x64.dll 和 libssl-3-x64.dll。 在 ./lib 目录中,engines-3 和 ossl-modules 中有 DLL。 好...

回答 1 投票 0

如何使用 boost 和 openssl 验证 ssl 证书

我需要将数据推送到服务器,并且数据需要安全地传输。 我正在使用 lib boost。 // SSL 上下文是必需的,并且保存证书 ssl::context ctx(ssl::context::tlsv13_clie...

回答 1 投票 0

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