破解aes密码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了破解aes密码相关的知识,希望对你有一定的参考价值。

破解aes密码,aes密码能破解码?怎么破解aes密码?在线等,高手来围观!!!!

算法破解就是找到加密算法的漏洞,进行技巧性的破解。
暴力破解是在知道加密算的情况下,用各种密码去测试。关于暴力破解也不是真正的暴力,有很多技术巧。如有效的密码字典就是一例。

AES目前没有算法浮出水面。
AES暴力破解与密码强度(如字串的MD5值就难,简单字串在密码字典排序告前,相对容易一些)和计算能力有关。但AES密钥长度太长,各种排列组合简直是天文数字,现有能力民间单机不可能破解。当然也可能一买彩票就中大奖,但似乎比那概率小得多。
参考技术A AES加、解密算法
AES加、解密算法

AES 是一种使用安全码进行信息加密的标准。
它支持 128 位、192 位和 256 位的密匙。

加密算法的实现在 ElAES.pas 单元中。
本人将其加密方法封装在 AES.pas 单元中,
只需要调用两个标准函数就可以完成字符串的加密和解密。

(* 密匙长度 *)

128 位支持长度为 16 个字符
192 位支持长度为 24 个字符
256 位支持长度为 32 个字符

所有加密和解密操作在默认情况下为 128 位密匙。

(* 文件列表 *)

..\Source\ AES 单元文件
..\Example\ 演示程序

(* 适用平台 *)

这份 Delphi 的执行基于 FIPS 草案标准,
并且 AES 原作者已经通过了以下平台的测试:

Delphi 4
Delphi 5
C++ Builder 5
Kylix 1

本人又重新进行了补充测试,并顺利通过了以下平台:

Delphi 6
Delphi 7

特别说明:

在 Delphi 3 标准版中进行测试时,因为缺少 Longword 数据类型和
Math.pas 文件,并且不支持 overload 指示字,所以不能正常编译。

(* 演示程序 *)

这个示例程序演示了如何使用 AES 模块进行字符串的加密和解密过程。

(* 使用方法 *)

在程序中引用 AES 单元。

调用函数 EncryptString 和 DecryptString 进行字符串的加密和解密。
调用函数 EncryptStream 和 DecryptStream 进行流的加密和解密。
调用过程 EncryptFile 和 DecryptFile 进行文件的加密和解密。

详细参阅 Example 文件夹中的例子。

(**************************************************)
(* *)
(* Advanced Encryption Standard (AES) *)
(* *)
(* Copyright (c) 1998-2001 *)
(* EldoS, Alexander Ionov *)
(* *)
(**************************************************)

unit ELAES;

interface

uses
Classes, SysUtils;

type
EAESError = class(Exception);

PInteger = ^Integer;

TAESBuffer = array [0..15] of byte;
TAESKey128 = array [0..15] of byte;
TAESKey192 = array [0..23] of byte;
TAESKey256 = array [0..31] of byte;
TAESExpandedKey128 = array [0..43] of longword;
TAESExpandedKey192 = array [0..53] of longword;
TAESExpandedKey256 = array [0..63] of longword;

PAESBuffer =^TAESBuffer;
PAESKey128 =^TAESKey128;
PAESKey192 =^TAESKey192;
PAESKey256 =^TAESKey256;
PAESExpandedKey128 =^TAESExpandedKey128;
PAESExpandedKey192 =^TAESExpandedKey192;
PAESExpandedKey256 =^TAESExpandedKey256;

// Key expansion routines for encryption

procedure ExpandAESKeyForEncryption(const Key: TAESKey128;
var ExpandedKey: TAESExpandedKey128); overload;
procedure ExpandAESKeyForEncryption(const Key: TAESKey192;
var ExpandedKey: TAESExpandedKey192); overload;
procedure ExpandAESKeyForEncryption(const Key: TAESKey256;
var ExpandedKey: TAESExpandedKey256); overload;

// Block encryption routines

procedure EncryptAES(const InBuf: TAESBuffer; const Key: TAESExpandedKey128;
var OutBuf: TAESBuffer); overload;
procedure EncryptAES(const InBuf: TAESBuffer; const Key: TAESExpandedKey192;
var OutBuf: TAESBuffer); overload;
procedure EncryptAES(const InBuf: TAESBuffer; const Key: TAESExpandedKey256;
var OutBuf: TAESBuffer); overload;

// Stream encryption routines (ECB mode)

procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey128; Dest: TStream); overload;
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; Dest: TStream); overload;

procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey192; Dest: TStream); overload;
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey192; Dest: TStream); overload;

procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey256; Dest: TStream); overload;
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey256; Dest: TStream); overload;

// Stream encryption routines (CBC mode)

procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const Key: TAESKey128; const InitVector: TAESBuffer; Dest: TStream); overload;
procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; const InitVector: TAESBuffer;
Dest: TStream); overload;

procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const Key: TAESKey192; const InitVector: TAESBuffer; Dest: TStream); overload;
procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey192; const InitVector: TAESBuffer;
Dest: TStream); overload;

procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const Key: TAESKey256; const InitVector: TAESBuffer; Dest: TStream); overload;
procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey256; const InitVector: TAESBuffer;
Dest: TStream); overload;

// Key transformation routines for decryption

procedure ExpandAESKeyForDecryption(var ExpandedKey: TAESExpandedKey128); overload;
procedure ExpandAESKeyForDecryption(const Key: TAESKey128;
var ExpandedKey: TAESExpandedKey128); overload;

procedure ExpandAESKeyForDecryption(var ExpandedKey: TAESExpandedKey192); overloa

2007-12-12 9:44:45 (**************************************************)
(* *)
(* Advanced Encryption Standard (AES) *)
(* Interface Unit v1.3 *)
(* *)
(* *)
(* Copyright (c) 2002 Jorlen Young *)
(* *)
(* *)
(* *)
(*说明: *)
(* *)
(* 基于 ElASE.pas 单元封装 *)
(* *)
(* 这是一个 AES 加密算法的标准接口。 *)
(* *)
(* *)
(* 作者:杨泽晖 2004.12.04 *)
(* *)
(* 支持 128 / 192 / 256 位的密匙 *)
(* 默认情况下按照 128 位密匙操作 *)
(* *)
(**************************************************)

unit Aes;

interface

uses
SysUtils, Classes, Math, ElAES;

type
TKeyBit = (kb128, kb192, kb256);

function StrToHex(Value: string): string;
function HexToStr(Value: string): string;
function EncryptString(Value: string; Key: string;
KeyBit: TKeyBit = kb128): string;
function DecryptString(Value: string; Key: string;
KeyBit: TKeyBit = kb128): string;
function EncryptStream(Stream: TStream; Key: string;
KeyBit: TKeyBit = kb128): TStream;
function DecryptStream(Stream: TStream; Key: string;
KeyBit: TKeyBit = kb128): TStream;
procedure EncryptFile(SourceFile, DestFile: string;
Key: string; KeyBit: TKeyBit = kb128);
procedure DecryptFile(SourceFile, DestFile: string;
Key: string; KeyBit: TKeyBit = kb128);

implementation

function StrToHex(Value: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Value) do
Result := Result + IntToHex(Ord(Value[I]), 2);
end;

function HexToStr(Value: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Value) do
begin
if ((I mod 2) = 1) then
Result := Result + Chr(StrToInt('0x'+ Copy(Value, I, 2)));
end;
end;

-- 字符串加密函数 默认按照 128 位密匙加密 --
function EncryptString(Value: string; Key: string;
KeyBit: TKeyBit = kb128): string;
var
SS, DS: TStringStream;
Size: Int64;
AESKey128: TAESKey128;
AESKey192: TAESKey192;
AESKey256: TAESKey256;
begin
Result := '';
SS:=TStringStream.Create(Value);
DS:=TStringStream.Create('');
try
Size := SS.Size;
DS.WriteBuffer(Size, SizeOf(Size));
-- 128 位密匙最大长度为 16 个字符 --
if KeyBit = kb128 then
begin
FillChar(AESKey128, SizeOf(AESKey128), 0 );
Move(PChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));
EncryptAESStreamECB(SS,0,AESKey128,DS);
end;
-- 192 位密匙最大长度为 24 个字符 --
if KeyBit = kb192 then
begin
FillChar(AESKey192, SizeOf(AESKey192), 0 );
Move(PChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));
EncryptAESStreamECB(SS, 0, AESKey192, DS);
end;
-- 256 位密匙最大长度为 32 个字符 --
if KeyBit = kb256 then
begin
FillChar(AESKey256, SizeOf(AESKey256), 0 );
Move(PChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
EncryptAESStreamECB(SS, 0, AESKey256, DS);
end;
Result := StrToHex(DS.DataString);
finally
SS.Free;
DS.Free;
end;
end;

-- 字符串解密函数 默认按照 128 位密匙解密 --
function DecryptString(Value: string; Key: string;
KeyBit: TKeyBit = kb128): string;
var
SS, DS: TStringStream;
Size: Int64;
AESKey128: TA

AES 自定义密码密钥

【中文标题】AES 自定义密码密钥【英文标题】:AES custom password key 【发布时间】:2017-10-28 15:50:54 【问题描述】:

我正在尝试实现 AES 自定义密码加密,并希望了解以下代码。

我不太明白为什么需要指定密钥大小 256“PBEKeySpec(password, salt, 65536, 256)”,当我使用“PBKDF2WithHmacSHA256”时,它假设将 SecretKey 生成为 256 位。

在使用我的密码+盐生成密钥后,为什么我需要将其与 SecretKeySpec 关联为 AES 算法。

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

【问题讨论】:

明确一点:您问的是基于密码的加密,其中密码用于派生密钥,然后用于加密其他数据,而不是加密密码本身,对吗?跨度> @ArtjomB。是的。我正在尝试实现基于密码的加密。我想我还有一个问题是加密这个“密码”,它是用来加密数据的。 【参考方案1】:

为什么需要指定密钥大小为 256

PBKDF2 是一个灵活的基于密码的密钥派生函数。它使用具有多次迭代的底层哈希函数。它可以输出您想要的任何大小的密钥。即使在生成 AES-128 密钥时也经常使用 SHA-256,因为不知道 SHA-256 会被破坏,并且与其他哈希函数(例如 MD5 和 SHA-512(仅在 x64 上)相比)相对较慢。缓慢是 PBKDF 的一个重要因素,因为当攻击者尝试暴力破解密码时,它会直接影响攻击者。当然,您还可以调整迭代次数。

此外,PBKDF2 可以输出比底层散列函数输出大小更多的密钥材料。例如,通常要求 PBKDF2 的输出包含 IV。在您的情况下,输出应该是 384 位长。

一般情况下,不建议向 PBKDF2 请求超过底层哈希函数。如果你也想推导出 IV,你应该 use SHA-512。只要每次加密随机生成盐并与密文一起存储,这应该足以实现语义安全。

所以,为了回答您的问题,PBKDF2 不知道您想如何使用输出。你对此负责。你必须知道你在做什么。有上百万种不同的方法可以解决加密的 PBKDF 部分。

为什么我需要将其与 SecretKeySpec 关联为 AES 算法。

如果您想使用 Cipher 实例使用 AES 加密某些内容,您需要传入一个 java.security.Key 对象,该对象将在运行时解析为 AES。 Key#getAlgorithm() 方法用于此目的。如果您在创建SecretKeySpec 时没有指定"AES",您将得到一个InvalidKeyException

【讨论】:

你的意思是我可以考虑 KeyGenerator.getInstance("HmacSHA256") 而不是 KeyGenerator.getInstance("AES") 如果我想要一个 AES 密钥进行加密?并使用 kgen.init(128);我可以指明我想要 128 位还是 256 位密钥。 HMAC 密钥与 PBKDF2 的输出不同。但由于 HMAC 和 AES 不要求密钥具有任何特定的内部结构,因此您可以生成 HMAC 密钥并将其用作 AES 密钥。问题是,你为什么要这样做?这对代码的可读性和可理解性非常不利。

以上是关于破解aes密码的主要内容,如果未能解决你的问题,请参考以下文章

C#(加密)Des很容易被破解吗?

压缩文件密码怎么解

PHP 加密:AES & RSA

https中加密算法的密钥是随机生成吗?和用户帐号密码有什么关联?

对称密码-分组密码-AES

用啥软件可以检测wifi的安全性。