Truecrypt的代码分析
在使用truecrypt接口的时候,实际上不需要非常了解truecrypt的源码,只需要了解truecrypt对外的接口就可以,如果调用truecrypt的接口,来实现我们想要的功能。
之前转载的四篇介绍truecrypt基本接口的文章,已经作了详细的说明。
truecrypt 最新版本中的部分结构体作了修改。
加载加密磁盘结构体
struct MountOptions
{
bool CachePassword; // 是否使用缓存密码
wstring FilesystemOptions;
wstring FilesystemType;
shared_ptr <KeyfileList> Keyfiles;
shared_ptr <DirectoryPath> MountPoint;
bool NoFilesystem;
bool NoHardwareCrypto;
bool NoKernelCrypto;
shared_ptr <VolumePassword> Password;
bool PartitionInSystemEncryptionScope;
shared_ptr <VolumePath> Path;
bool PreserveTimestamps;
VolumeProtection::Enum Protection;
shared_ptr <VolumePassword> ProtectionPassword;
shared_ptr <KeyfileList> ProtectionKeyfiles;
bool Removable;
bool SharedAccessAllowed;
VolumeSlotNumber SlotNumber;
bool UseBackupHeaders;
}
创建加密磁盘的结构体
struct VolumeCreationOptions
{
VolumePath Path; // 分区名
VolumeType::Enum Type; // 普通分区还是掩藏分区
uint64 Size; // 分区大小
shared_ptr <VolumePassword> Password;//密码
shared_ptr <KeyfileList> Keyfiles; //
shared_ptr <Pkcs5Kdf> VolumeHeaderKdf; // 哈希算法
shared_ptr <EncryptionAlgorithm> EA; // 加密算法
bool Quick; // 是否快速格式化
struct FilesystemType // 格式
{
enum Enum
{
Unknown = 0,
None,
FAT,
NTFS,
Ext2,
Ext3,
Ext4,
MacOsExt,
UFS
};
FilesystemType::Enum Filesystem; // 类型,是文件或者是磁盘分区
uint32 FilesystemClusterSize;// 族大小
uint32 SectorSize; // 扇区大小
}
truecrypt加密算法介绍
truecrypt中的加密算法
AES
Serpent
Twofish
AESTwofish
AESTwofishSerpent
SerpentAES
SerpentTwofishAES
TwofishSerpent
哈希算法
AESBlowfish
AESBlowfishSerpent
Blowfish
Cast5
TripleDES
在cryto中,我们可以看到有
Aes,Blowfish,Cast5,TripleDes,Serpent,Twofish这几种加密算法。而上面这么多的加密算法,就是把这几种加密算法结合一起使用。
AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法;
BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
CAST-128(Cast):是一种类似于DES的置换组合网路(Substitution-PermutationNetwork,SPN)加密系统,对于微分密码分析、线性密码分析、密码相关分析具有较好的抵抗力
TripleDES(三重DES):数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
Serpent:是 Ross Anderson, Eli Biham 和 Lars Knudsen 开发的块加密算法. Serpent 可以使用不同的密钥长度. Serpent 也是高级加密标准 (AES)的5个候选之一.
Twofish:Twofish 则是counterpane 公司向NIST提交的一种满足AES 要求的加密算法。Twofish 采用128位数据块(128 bits block),128- 192- 256-bit 可变长度密钥
70年代以来DES是美国政府所采用的加密标准,但DES使用的56位密钥过短,随着电脑计算能力的不断提高,已经越来越不安全了,以现代计算能力,24小时内即可能破解DES。
在90年代中期,美国国家标准与技术研究院(NIST)开始考虑用高级加密标准(Advanced Encryption Standard 即AES)替代DES。
AES是采用公开竞标的,NIST的要求是:候选算法使用128bit的区块;候选算法必须使用最小128bit长度的密钥,并且可以向上扩大,且可以使 用128、192、256bit密钥;候选算法要足够快,最好和DES算法差不多快;候选算法必须免费,没有知识产权约束。可以提名专利算法,但是如果被 选,必须成为免费使用许可。
最初有约15种算法被提交作为AES的候选算法,经过长时间筛选,NIST测试的算法减少到5个,分别为Rijndael、Serpent、 Twofish、MARS 和RC6。再次筛选后还剩Rijndael、Serpent、Twofish,这三种算法各有长短,Serpent被认为最安全,而Rijndael速度 最快,Twofish则居中。
最后NIST选择了Rijndael作为AES的算法
加密模式
所谓模式,就是方法,就是加密的方法,既然是对称加密,解密方法也包括在内了。在分组密码理论上,简单的说就是一个分组经过加密,产生一个对应的分组密 文,至于如何加密,没有限制,模式就对应这里的“如何加密”,从A点到B点,我们可以有多种走法,供君选择,可以是直接A到B,也可以是A到C再到B。在 软件结构上也常如此,上层可能不需要知道底层如何工作,下层也不认识上层,各自做自己的分内事就好了。不知道设计者是否就是出于这样的考虑,才提出这样的 概念。正如哲学所说:机制与策略分离,果真如此。为什么今天才想通,怪!可能是把加密算法(cipher algorithm)与模式(mode)弄混了吧。模式中会用到加密算法,加密算法属于模式中的一个环节。常见的分组加密算法有: DES、3DES和AES。它们都有可与之搭配的模式
CBC(Cipher Block Chaining)
A. 所有分组使用同一密钥;但是,加密算法的输入是本次分组明文与前次密文的异或(第一次需要IV),这就克服了ECB相同明文产生相同密文的缺陷。
B. 加密函数加密,解密函数解密。
哈希算法
Ripemd160
Sha512
Whirlpool
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。
RIPEMD:顾名思义RIPEMD就是成熟md算法,是Hans Dobbertin等3人在md4,md5的基础上,于1996年提出来的。算法共有4个标准128、160、256和320,其对应输出长度分别为16 字节、20字节、32字节和40字节。不过,让人难以致信的是RIPEMD的设计者们根本就没有真正设计256和320位这2种标准,他们只是在128位 和160位的基础上,修改了初始参数和s-box来达到输出为256和320位的目的。所以,256位的强度和128相当,而320位的强度和160位相 当。RIPEMD建立在md的基础之上,所以,其添加数据的方式和md5完全一样。