encryption 相关问题

加密是使用结合参数(称为加密密钥)的加密算法将信息(称为明文)转换为不可读形式(称为密文)的过程。只有拥有解密密钥的人才能撤销该过程并恢复原始明文。有关加密的概念问题可能会在crypto.stackexchange.com上获得更好的答案。

在 Postgres/Supabase 中生成 HMAC 和安全性

我需要使用 Supabase 上的 Postgres 功能为我的用户生成 hmac。我正在运行以下命令,以便在用户请求时在运行时生成它。 创建或替换函数 get...

回答 1 投票 0

SQL Server Always 加密功能

有没有办法完成以下任务?我有一位客户使用 2 个数据库,一个用于现场工作,另一个用于存储存档数据。 他们最近加密了......

回答 1 投票 0

用BC解密字符串

我有一个使用 Grails 6.1.2 编写的 Web 应用程序。我必须加密数据库中的几个字段,因此我决定使用基于著名的 jasypt 库的 grails-jasypt。它的工作原理就像一个ch...

回答 1 投票 0

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

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

回答 1 投票 0

PermissionError: [Errno 13] Python 程序中的权限被拒绝

当我运行我的Python程序时,我遇到一个错误:PermissionError: [Errno 13] Permission被拒绝,我不知道为什么它不起作用我想知道我是否可以以某种方式提升自己,当

回答 1 投票 0

C# 中的安全消息传递实现

建立 PACE PIN 身份验证后,我正在尝试实现安全消息传递,以便能够发送安全的 APDU 命令。我的实施基于 ICAO 9303 第 11 部分手册,第 9.8 章...

回答 1 投票 0

有什么办法可以使用HD钱包私钥/公钥进行非对称加密吗?

我正在开发一个 Flutter 应用程序,该应用程序为使用 BIP39 和 BIP32 的用户创建加密钱包。 使用 BIP39 和 BIP32 我可以为用户创建助记符、私钥和公钥。 现在需要做...

回答 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

AES-256-CBC 加密在 Python 和 PHP 中返回不同的结果,HELPPP

Python代码: 从 Crypto.Random 导入 get_random_bytes 从 Crypto.Cipher 导入 AES 从 Crypto.Util.Padding 导入 pad 导入base64 def 加密字符串(输入字符串,

回答 1 投票 0

如何列出 GnuPG 加密消息的信息?

我仍在使用 GPG,如这篇文章中所示:How do I encrypt plaintext with GnuPG? 我现在需要的是能够列出加密消息的各种信息(例如所有收件人),而无需...

回答 1 投票 0

RSA 加密-解密:BadPaddingException:数据必须以零开头

对于一个被问了很多次的问题,我很抱歉向你询问你的技能。 我有一个关于 RSA 加密的问题。 我已经检查过有关此问题的其他主题,但我没有找到任何有用的答案...

回答 2 投票 0

Python GNUPG 加载私钥时出现未知系统错误

请注意:尽管我在这里提到了 Azure Databricks,但我相信这本质上是一个 Python/GNUPG 问题,因此任何具有 Python/GNUPG 加密经验的人都可以回答。 我有...

回答 2 投票 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

在 AuthenticationBuilder 中处理加密的 SAML 时“未找到给定令牌的令牌验证器”

我维护一个使用联合 IDP 和 SAML 的 .NET 6 Web 应用程序。 我们的 IDP 现在强制对 SAML(不仅仅是 SSL)进行加密,这引起了一些麻烦。 以下是相关...

回答 1 投票 0

使用特定密钥生成10位TOTP密码

此问题与 RFC6238 中指定的 TOTP 有关:https://www.rfc-editor.org/rfc/rfc6238#section-1.2。 我要实现RFC6238来生成一个10位TOTP密码,这将是你...

回答 3 投票 0

如何确保Python替换密码解码中破译消息的增量变化?

我正在研究一种破译方法。我想通过用户输入手动破译一个句子。 随机导入 密码学类: def __init__(自身, 输入文件): self.input_file = input_file ...

回答 1 投票 0

使用 AES 解密时收到错误消息“输入字符串不是完整的块”

*加密的密钥是从java代码传递的,而我想在c#中解密。 下面是Java中的解密逻辑 私有静态最终字符串 AES_ALGO = "AES"; 私有静态最终字符串

回答 1 投票 0

IBM MARS 密码测试向量

您好, 目前,我正在通过编写自己的 AES 决赛密码实现来学习 Raspberry Pi 1 Model B+ 上的 ARM 汇编。我想使用 IBM 测试向量测试我的 MARS 实现,但是...

回答 1 投票 0

使用公钥加密flutter中的数据

我需要在flutter中创建以下代码,使用RSAES-OAEP/SHA-256/MGF1-SHA-1用公钥加密数据 textPayPass=document.getElementById('tpassword').value; $('tpassword').val(''); s_...

回答 1 投票 0

c# GPG 压缩并加密文件流

我需要对文件流进行 ZIP 和 GPG 加密。 然后通过SFTP上传。 我正在使用 Zip Archive 来创建条目。 我正在使用 GPG 进行加密,starksoft.aspen Nuget。 在这里获取本地文件流和

回答 1 投票 0

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