精华内容
下载资源
问答
  • 我现在在做一个linux文件过滤驱动的透明加密 x86的架构下 劫持系统调用就可以实现了 那么arm架构下的linux要怎么去实现呢? 还是劫持系统调用吗?我查找了一下,好像没有人做过这方面的 有的也只是x86下的 不...
  • 简介LUKS是一种磁盘加密规范,可帮助你在一个捆绑包中实现文件加密,磁盘加密和数据加密。LUKS可以帮助保护你的驱动器免受盗窃等攻击,但是一旦解锁,它就无法保护你的数据免遭访问,它可以与其他加密软件一起使用,...

    本文介绍如何使用LUKS(Linux Unified Key Setup)在启用UEFI的系统上安装Arch Linux并进行全硬盘加密。

    c52c53c13b97c04812d3e48ff0ae078f.png

    简介

    LUKS是一种磁盘加密规范,可帮助你在一个捆绑包中实现文件加密,磁盘加密和数据加密。

    LUKS可以帮助保护你的驱动器免受盗窃等攻击,但是一旦解锁,它就无法保护你的数据免遭访问,它可以与其他加密软件一起使用,以实现数据安全性。

    设置磁盘分区

    我的分区方案将/dev/sda1作为efi分区,/dev/sda2作为启动分区,/dev/sda3作为LVM物理卷,/dev/arch/root作为root分区来安装Arch Linux,/dev/arch/home作为主分区,/dev/arch/swap作为交换分区。

    分区选择的工具是Parted(参考:怎样用parted管理硬盘分区),你也可以将gdisk用于efi或fdisk用于MBR,请将gpt标签替换为mbr以获取正确的磁盘标签类型:

    parted /dev/sda

    mklabel gpt

    mkpart ESP fat32 1MiB 200MiB

    set 1 boot on

    name 1 efi

    mkpart primary 200MiB 800MiB

    name 2 boot

    mkpart primary 800MiB 100%

    set 3 lvm on

    name 3 lvm

    print

    配置LUKS

    下一步是加载内核模块以使用luks安装Arch Linux,在使用cryptsetup之前,请务必确保已加载dm_crypt内核模块:

    modprobe dm-crypt

    modprobe dm-mod

    然后继续使用cryptseup命令创建加密设备,Cryptsetup是与dm-crypt接口的命令行工具,用于创建,访问和管理加密设备。

    Cryptsetup支持依赖Linux内核设备映射器和加密模块的不同加密类型。

    该工具使用如下:

    # cryptsetup

    通过device-mapper访问的设备称为blockdevices。

    可以使用以下方法检查可用选项:

    $ cryptsetup --help

    现在让我们在/dev/sda3上创建一个新的LUKS设备:

    # cryptsetup luksFormat -v -s 512 -h sha512 /dev/sda3

    使用的选项:

    luksFormat:格式化LUKS设备。

    -v,-verbose:显示更详细的错误消息。

    -s,-key-size:加密密钥的大小,本例中为512位。

    -h,-hash:用于从密码短语创建加密密钥的哈希。

    当你执行上面的命令时,将收到一条警告消息,只需键入YES继续,然后输入并验证要使用的密码。

    现在我们已经创建了luks加密设备,我们需要打开设备作为映射,语法是:

    # cryptsetup open

    注解:

    是在/dev/mapper下创建的设备。

    是加密设备。

    所以我的看起来如下:

    # cryptsetup open /dev/sda3 luks_lvm

    LVM配置

    对于那些刚接触LVM的人来说,LVM的基本构建块是:

    1、物理量(PV)

    在可以拥有卷组的硬盘(甚至磁盘本身或环回文件)上进行分区。

    它有一个特殊的标题,分为物理范围。

    将物理卷视为用于构建硬盘的大型构建块。

    2、卷组(VG)

    用作存储卷的物理卷组(作为一个磁盘)。

    它们包含逻辑卷。

    将卷组视为硬盘驱动器。

    3、逻辑音量(LV)

    驻留在卷组中的“虚拟/逻辑分区”,由物理盘区组成。

    将逻辑卷视为普通分区。

    4、物理范围(PE)

    物理卷中可以分配给逻辑卷的最小大小(默认为4MiB)。

    将物理盘区视为可以分配给任何分区的磁盘部分。

    下面进行配置部分。

    创建物理卷:

    pvcreate /dev/mapper/luks_lvm

    创建名为arch的卷组:

    vgcreate arch /dev/mapper/luks_lvm

    为root、home和swap分区创建逻辑卷:

    lvcreate -n home -L 70G arch

    lvcreate -n root -L 120G arch

    lvcreate -n swap -L 1G -C y arch

    格式化分区:

    mkfs.fat -F32 /dev/sda1

    mkfs.ext4 /dev/sda2

    mkfs.btrfs -L root /dev/mapper/arch-root

    mkfs.btrfs -L home /dev/mapper/arch-home

    mkswap /dev/mapper/arch-swap

    安装分区:

    swapon /dev/mapper/arch-swap

    swapon -a ; swapon -s

    mount /dev/mapper/arch-root /mnt

    mkdir -p /mnt/{home,boot}

    mount /dev/sda2 /mnt/boot

    mount /dev/mapper/arch-home /mnt/home

    mkdir /mnt/boot/efi

    mount /dev/sda1 /mnt/boot/efi

    确认是否所有装置都正确安装:

    lsblk -f

    安装Arch Linux

    安装基础系统:

    pacstrap /mnt base base-devel efibootmgr vim dialog \

    xterm btrfs-progs grub --noconfirm

    生成fstab文件:

    genfstav -U -p /mnt > /mnt/etc/fstab

    切换到chroot环境:

    arch-chroot /mnt /bin/bash

    配置mkinitcpio:

    vim /etc/mkinitcpio.conf

    向下滚动,直到找到HOOKS部分,然后在filesystem之前添加行:

    encrypt lvm2

    Hooks由其名称引用,并按配置文件中HOOKS设置中存在的顺序执行,HOOKS行看起来像这样:

    HOOKS="base udev autodetect modconf block encrypt lvm2 filesystems keyboard fsck"

    生成新的initramfs映像:

    mkinitcpio -v -p linux

    安装grub并生成grub.cnf文件:

    pacman -s grub --noconfirm

    grub-install --efi-directory=/boot/efi

    配置内核参数

    为了启用加密的根分区,需要设置以下内核参数的子集,如果使用encrypt hook,请将选项添加到内核参数,要修改的文件是/etc/default/grub:

    cryptdevice=/dev/:devicemapper_name cryptkey=

    device是支持加密设备的设备的路径。

    devicemapper_name是解密后为设备提供的设备映射器名称,将以/dev/mapper/devicemapper_name的形式提供。

    例如:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet resume=/dev/mapper/swap \

    cryptdevice=/dev/sda3:luks_lvm"

    请注意,在生成引导配置之前,最好将相关参数添加到/etc/default/grub。

    在启动时解锁根分区(可选)

    要使用密钥文件在启动时解锁根文件系统,你必须生成密钥文件,为其提供适当的权限并将其添加为LUKS密钥:

    dd if=/dev/urandom of=/crypto_keyfile.bin  bs=512 count=10

    chmod 000 /crypto_keyfile.bin

    chmod 600 /boot/initramfs-linux*

    cryptsetup luksAddKey /dev/sda3 /crypto_keyfile.bin

    现在在mkinicpio.conf文件中的FILES指令下包含/crypto_keyfile.bin文件:

    # vim /etc/mkinitcpio.conf

    增加:

    FILES=/crypto_keyfile.bin

    重新生成ramdisk文件:

    mkinitcpio -p linux

    重新生成grub.cfg文件:

    grub-mkconfig -o /boot/grub/grub.cfg

    grub-mkconfig -o /boot/efi/EFI/arch/grub.cfg

    安装后的配置

    剩下的部分是安装必要的软件包,如Xorg服务器、pulseaudio、alsa实用程序、synaptics触摸板驱动程序、设置root密码、添加标准用户帐户、设置时区、添加aur和multilib存储库。

    我写了一个简单的bash脚本来自动化这个过程,以下是如何使用脚本的过程:

    pacman -S git --noconfirm

    git clone https://github.com/jmutai/dotfiles.git

    cp dotfiles/setup/pacman.conf /etc/pacman.conf

    cp dotfiles/setup/live-setup.sh .

    chmod +x live-setup.sh

    ./live-setup.sh

    可以修改实时设置脚本以更改时区设置和系统主机名,可以使用你选择的桌面环境替换i3的安装,成功安装后,退出chroot环境,卸载分区并重新启动系统:

    exit

    umount -R /mnt

    reboot

    至此,目的达成。

    相关主题

    展开全文
  • 导读:使用 Linux 统一密钥设置(LUKS)为物理驱动器或云存储上的敏感文件创建一个加密保险库。 本文字数:1950,阅读时长大约:2分钟https://linux.cn/art...

     

    导读:使用 Linux 统一密钥设置(LUKS)为物理驱动器或云存储上的敏感文件创建一个加密保险库。   

    本文字数:1950,阅读时长大约:2分钟

    https://linux.cn/article-13296-1.html
    作者:Seth Kenlon
    译者:Xingyu.Wang

    最近,我演示了如何在 Linux 上使用统一密钥设置(Linux Unified Key Setup)(LUKS)和 cryptsetup 命令 实现全盘加密。虽然加密整个硬盘在很多情况下是有用的,但也有一些原因让你不想对整个硬盘进行加密。例如,你可能需要让一个硬盘在多个平台上工作,其中一些平台可能没有集成 LUKS。此外,现在是 21 世纪,由于云的存在,你可能不会使用物理硬盘来处理所有的数据。

    几年前,有一个名为 TrueCrypt 的系统,允许用户创建加密的文件保险库,可以通过 TrueCrypt 解密来提供读/写访问。这是一项有用的技术,基本上提供了一个虚拟的便携式、完全加密的驱动器,你可以在那里存储重要数据。TrueCrypt 项目关闭了,但它可以作为一个有趣的模型。

    幸运的是,LUKS 是一个灵活的系统,你可以使用它和 cryptsetup 在一个独立的文件中创建一个加密保险库,你可以将其保存在物理驱动器或云存储中。

    下面就来介绍一下怎么做。

    1、建立一个空文件

    首先,你必须创建一个预定大小的空文件。就像是一种保险库或保险箱,你可以在其中存储其他文件。你使用的命令是 util-linux 软件包中的 fallocate:

    $ fallocate --length 512M vaultfile.img
    

    这个例子创建了一个 512MB 的文件,但你可以把你的文件做成任何你想要的大小。

    2、创建一个 LUKS 卷

    接下来,在空文件中创建一个 LUKS 卷:

    $ cryptsetup --verify-passphrase \
        luksFormat vaultfile.img
    

    3、打开 LUKS 卷

    要想创建一个可以存储文件的文件系统,必须先打开 LUKS 卷,并将其挂载到电脑上:

    $ sudo cryptsetup open \
        --type luks vaultfile.img myvault
    $ ls /dev/mapper
    myvault
    

    4、建立一个文件系统

    在你打开的保险库中建立一个文件系统:

    $ sudo mkfs.ext4 -L myvault /dev/mapper/myvault
    

    如果你现在不需要它做什么,你可以关闭它:

    $ sudo cryptsetup close myvault
    

    5、开始使用你的加密保险库

    现在一切都设置好了,你可以在任何需要存储或访问私人数据的时候使用你的加密文件库。要访问你的保险库,必须将其挂载为一个可用的文件系统:

    $ sudo cryptsetup open \
        --type luks vaultfile.img myvault
    $ ls /dev/mapper
    myvault
    $ sudo mkdir /myvault
    $ sudo mount /dev/mapper/myvault /myvault
    

    这个例子用 cryptsetup 打开保险库,然后把保险库从 /dev/mapper 下挂载到一个叫 /myvault 的新目录。和 Linux 上的任何卷一样,你可以把 LUKS 卷挂载到任何你想挂载的地方,所以除了 /myvault,你可以用 /mnt 或 ~/myvault 或任何你喜欢的位置。

    当它被挂载后,你的 LUKS 卷就会被解密。你可以像读取和写入文件一样读取和写入它,就像它是一个物理驱动器一样。

    当使用完你的加密保险库时,请卸载并关闭它:

    $ sudo umount /myvault
    $ sudo cryptsetup close myvault
    

    加密的文件保险库

    你用 LUKS 加密的镜像文件和其他文件一样,都是可移动的,因此你可以将你的保险库存储在硬盘、外置硬盘,甚至是互联网上。只要你可以使用 LUKS,就可以解密、挂载和使用它来保证你的数据安全。轻松加密,提高数据安全性,不妨一试。


    via: https://opensource.com/article/21/4/linux-encryption

    作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

    本文由 LCTT 原创编译,Linux中国 荣誉推出


    欢迎遵照 CC-BY-NC-SA 协议规定转载,

    如需转载,请在文章下留言 “转载:公众号名称”,

    我们将为您添加白名单,授权“转载文章时可以修改”。

    展开全文
  • 导读:使用 Linux 统一密钥设置(LUKS)为物理驱动器或云存储上的敏感文件创建一个加密保险库。  本文字数:1950,阅读时长大约:2分钟 关注微信公众号:厦门微思网络 最近,我演示了如何在 Linux 上使用统一...

     

     

    关注微信公众号:厦门微思网络

     

    最近,我演示了如何在 Linux 上使用统一密钥设置(Linux Unified Key Setup)(LUKS)和 cryptsetup 命令 实现全盘加密。虽然加密整个硬盘在很多情况下是有用的,但也有一些原因让你不想对整个硬盘进行加密。例如,你可能需要让一个硬盘在多个平台上工作,其中一些平台可能没有集成 LUKS。此外,现在是 21 世纪,由于云的存在,你可能不会使用物理硬盘来处理所有的数据。

    几年前,有一个名为 TrueCrypt 的系统,允许用户创建加密的文件保险库,可以通过 TrueCrypt 解密来提供读/写访问。这是一项有用的技术,基本上提供了一个虚拟的便携式、完全加密的驱动器,你可以在那里存储重要数据。TrueCrypt 项目关闭了,但它可以作为一个有趣的模型。

    幸运的是,LUKS 是一个灵活的系统,你可以使用它和 cryptsetup 在一个独立的文件中创建一个加密保险库,你可以将其保存在物理驱动器或云存储中。

    下面就来介绍一下怎么做。

     

    1、建立一个空文件

    首先,你必须创建一个预定大小的空文件。就像是一种保险库或保险箱,你可以在其中存储其他文件。你使用的命令是 util-linux 软件包中的 fallocate

    
     
    1. $ fallocate --length 512M vaultfile.img

    这个例子创建了一个 512MB 的文件,但你可以把你的文件做成任何你想要的大小。

     

    2、创建一个 LUKS 卷

    接下来,在空文件中创建一个 LUKS 卷:

    
     
    1. $ cryptsetup --verify-passphrase \

    2. luksFormat vaultfile.img

     

    3、打开 LUKS 卷

    要想创建一个可以存储文件的文件系统,必须先打开 LUKS 卷,并将其挂载到电脑上:

    
     
    1. $ sudo cryptsetup open \

    2. --type luks vaultfile.img myvault

    3. $ ls /dev/mapper

    4. myvault

     

    4、建立一个文件系统

    在你打开的保险库中建立一个文件系统:

    
     
    1. $ sudo mkfs.ext4 -L myvault /dev/mapper/myvault

    如果你现在不需要它做什么,你可以关闭它:

    
     
    1. $ sudo cryptsetup close myvault

     

    5、开始使用你的加密保险库

    现在一切都设置好了,你可以在任何需要存储或访问私人数据的时候使用你的加密文件库。要访问你的保险库,必须将其挂载为一个可用的文件系统:

    
     
    1. $ sudo cryptsetup open \

    2. --type luks vaultfile.img myvault

    3. $ ls /dev/mapper

    4. myvault

    5. $ sudo mkdir /myvault

    6. $ sudo mount /dev/mapper/myvault /myvault

    这个例子用 cryptsetup 打开保险库,然后把保险库从 /dev/mapper 下挂载到一个叫 /myvault 的新目录。和 Linux 上的任何卷一样,你可以把 LUKS 卷挂载到任何你想挂载的地方,所以除了 /myvault,你可以用 /mnt 或 ~/myvault 或任何你喜欢的位置。

    当它被挂载后,你的 LUKS 卷就会被解密。你可以像读取和写入文件一样读取和写入它,就像它是一个物理驱动器一样。

    当使用完你的加密保险库时,请卸载并关闭它:

    
     
    1. $ sudo umount /myvault

    2. $ sudo cryptsetup close myvault

     

    加密的文件保险库

    你用 LUKS 加密的镜像文件和其他文件一样,都是可移动的,因此你可以将你的保险库存储在硬盘、外置硬盘,甚至是互联网上。只要你可以使用 LUKS,就可以解密、挂载和使用它来保证你的数据安全。轻松加密,提高数据安全性,不妨一试。

     

    end  关注微信公众号:厦门微思网络

    展开全文
  • sha1加密驱动

    千次阅读 2013-05-30 11:16:36
     本文档介绍DS28E01-100的加密驱动,该加密驱动支持x86和ppc硬件环境,同时可以在linux和vxworks上运行。DS28E01使用1--WIRE总线,只需要一个引脚就可以完成读写数据和同步时钟的功能。 2 用户接口 1  2.1软件...

    概述

        本文档介绍DS28E01-100的加密驱动,该加密驱动支持x86ppc硬件环境,同时可以在linuxvxworks上运行。DS28E01使用1--WIRE总线,只需要一个引脚就可以完成读写数据和同步时钟的功能。

    用户接口

    2.1软件环境的不同

        本由于操作系统的不同,在具体操作上有所差异,在源码里提供了license.h文件,可以在里面定义宏定义来标识使用的环境。其中LICENSE_LINUX在我们使用的是linux系统时需要定义它;如果是vxworks系统,则定义LICENSE_VXWORKS宏定义。

    2.2留给用户的接口

    对用户只要加载我们的库文件,就可以调用 c3itop_check_codon( void * p1, void * p2 , void *func),当然需要先申请三个指针,其中p1标识校验密码成功,而p2标志着校验失败。

    这个函数里调用了两个函数,分别用来初始化硬件和校验密钥。

    关于校验密钥在第三章的校验密钥中有描述,下节描述硬件的初始化。

    2.2硬件的初始化

    针对vxworks平台,DS28E01加密芯片挂接在显卡上,所以需要先调用pciConfigInLong(b, d, f, 0x18, &memio_addr)获取io映射地址,并且经过偏移得到对应的gpio data寄存器和gpio

    Control寄存器。control寄存器可以将gpio设置成输入或输出。

        而对于ppclinux平台,DS28E01连接到cpu的一个管脚上,需要控制mmap GPIO寄存器,然后根据偏移得到控制寄存器,数据寄存器和上拉寄存器。

        

    密钥的写入和校验

    3.1写入密钥

         unique:用于指定参与到SHA-1运算中的64位密码的特性。

         anoy:当为DISABLE时器件的64ROM ID参与到SHA-1运算中。否则64ROM ID8个字节的0xFF取代输入至SHA-1 buffer

          对于unique,我们取disnableanoy则取enable;即始终不使用rom id参与密码生成和计算;

    3.1.1初始化

        要写入密钥,首先要初始化密钥,并且初始化要使用的指令和地址等变量;

        1.初始化TA1TA2,即地址寄存器;

        2.获取rom id,这是一个出厂已经固化好的,我们只要读出来并校验就行了。getromid()有两个功能,首先读取密钥并且赋值给全局变量ROMID数组,方便我们使用;第二个功能就是检验,判断接受到的数据和发送数据是否一致。这里使用的是crc8校验。关于64位密钥的校验,则使用crc16位校验。

        3.将我们的密钥赋值给devicessecret;

    3.1.2写密钥

          接下来就要将密钥写入暂存区。为什么要先写入暂存区而不是密码存储区,这主要是为了防止密钥传输过程中出错。现在来分析下writesc()这个函数:

    databuffer[i++] = Wrscratch;

    databuffer[i++] = TA1;

    databuffer[i++] = TA2;

    进行初始化,将写暂存区和两个地址寄存器地址拷贝给databuffer,然后将密钥赋值给databuffer:

    for (j = 0; j <= (i - 1); j++) {

    ow_writebyte(databuffer[j]);

    }

    然后读取校验码:

    databuffer[i++] = ow_readbyte(); /* Read back first byte of CRC16. */

    databuffer[i] = ow_readbyte(); /* Read back second byte of CRC16. */

    接下来进行校验,判断校验值;

    3.1.3校验和load

        写入rom命令和读取命令,然后读回13个字节,进行校验;最后将数据load到密码区域。最后清零暂存区,执行copy暂存区后执行refresh暂存区,可减少失效弱位的位数。

    3.2校验密钥

    3.2.1前期准备

        首先将头两个字节设置成0x00,然后加5个随机数,最后再写一个0x00,凑够8个数;

    然后将这些数据写入。同时读取缓存数据,看是否正确,这是为后面的hash校验做准备。

    随后设置romid为0xff,这个romid在hash校验算法中会用到,写入Anautpage命令 ,读取数据并校验。

    前期的工作主要是为hash算法做准备,为hash算法的实现准备数据。

    3.2.2hash算法校验

    1.前期初始化

    memcpy(SHAVM_Message, devicesecret, 4); /* Copy the devicesecret to input buffer. */

    memcpy(&SHAVM_Message[4], &pageback[3], 32); /* Fill 32 bytes page data to input buffer. */

    memcpy(&SHAVM_Message[36], &subpbuffer[2] , 2); /* Set 2 bytes of challenge to input buffer. */

    SHAVM_Message[38] = 0xFF;

    SHAVM_Message[39] = 0xFF;

    SHAVM_Message[40] = 0x40 | TA1 >> 5; /* Set MPX. */ 

    memcpy(&SHAVM_Message[41], ROMID, 7); /* Input ROMID */

    memcpy(&SHAVM_Message[48], &devicesecret[4], 4);/* Input another 4 bytes of basic secret to input buffer. */

    memcpy(&SHAVM_Message[52], &subpbuffer[4], 3); /* Set the input buffer as defined by datasheet. */

    SHAVM_Message[55] = 0x80; /* Set the input buffer as defined by datasheet. */ 

        memset(&SHAVM_Message[56], 0x00, 6); /* Set the input buffer as defined by datasheet. */ 

        SHAVM_Message[62] = 0x01; /* Set the input buffer as defined by datasheet. */ 

        SHAVM_Message[63] = 0xB8;

    for (i = 0; i <= 7; i++) {

    devicesecret[i] = 0x00;

    }

    先来看一下hash算法都用了哪些数据:

    (1)先写4个密钥,将其他4个字节的密钥写到第48字节;

    (2)Anautpage写入和读取的数据;

    (3)5个我们在第一步生成的随机数;

    (4)0x40|TA1>>5

    (5)然后写入一些数据手册规定的常数;

    2.hash算法

         hash算法的代码和原理在后面hash算法章节会有所描述,这里通过该算法得到8位mac地址,并且和ds28e01返回的数据进行比较,如果比较成功,则数据校验正确。

    HASH算法

    4.1基本概念

    对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。

    SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串。SHA1算法只接受位作为输入。假设我们对字符串“abc”产生消息摘要。首先,我们将它转换成位字符串如下:

    01100001 01100010 01100011

    ―――――――――――――

    ‘a’=97 ‘b’=98 ‘c’=99

    这个位字符串的长度为24。下面我们需要5个步骤来计算消息摘要MAC

    4.1.1 补位

    消息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)%512 = 448。即使长度已经满足对512取模后余数是448,补位也必须要进行。

    补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448。总而言之,补位是至少补一位,最多补512位。还是以前面的“abc”为例显示补位的过程。

    原始信息: 01100001 01100010 01100011

    补位第一步:01100001 01100010 01100011 1

    首先补一个“1”

    补位第二步:01100001 01100010 01100011 10…..0

    然后补423“0”

    我们可以把最后补位完成后的数据用16进制写成下面的样子

    61626380 00000000 00000000 00000000

    00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000

    00000000 00000000

    现在,数据的长度是448了,我们可以进行下一步操作。

    4.1.2补长度

    所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)

    61626380 00000000 00000000 00000000

    00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000000

    00000000 00000000 00000000 00000018

    如果原始的消息长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。

    4.2算法

    4.2.1 使用的常量

    一系列的常量字K(0), K(1), ... , K(79),如果以16进制给出。它们如下:

    Kt = 0x5A827999 (0 <= t <= 19)

    Kt = 0x6ED9EBA1 (20 <= t <= 39)

    Kt = 0x8F1BBCDC (40 <= t <= 59)

    Kt = 0xCA62C1D6 (60 <= t <= 79).

    4.2.1需要使用的函数

    SHA1中我们需要一系列的函数。每个函数ft (0 <= t <= 79)都操作32位字BCD并且产生32位字作为输出。ft(B,C,D)可以如下定义

    ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)

    ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)

    ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)

    ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).

    4.2.2 计算消息摘要

    必须使用进行了补位和补长度后的消息来计算消息摘要。计算需要两个缓冲区,每个都由532位的字组成,还需要一个8032位字的缓冲区。第一个5个字的缓冲区被标识为ABCDE。第二个5个字的缓冲区被标识为H0, H1, H2, H3, H4

    80个字的缓冲区被标识为W0, W1,..., W79

    另外还需要一个一个字的TEMP缓冲区。

    为了产生消息摘要,在第4部分中定义的16个字的数据块M1, M2,..., Mn

    会依次进行处理,处理每个数据块Mi 包含80个步骤。

    在处理每个数据块之前,缓冲区{Hi} 被初始化为下面的值(16进制)

    H0 = 0x67452301

    H1 = 0xEFCDAB89

    H2 = 0x98BADCFE

    H3 = 0x10325476

    H4 = 0xC3D2E1F0.

    现在开始处理M1, M2, ... , Mn。为了处理 Mi,需要进行下面的步骤

    (1). 将 Mi 分成 16 个字 W0, W1, ... , W15, W0 是最左边的字

    (2). 对于 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16).

    (3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.

    (4) 对于 t = 0 到 79,执行下面的循环

    TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;

    E = D; D = C; C = S30(B); B = A; A = TEMP;

    (5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.

    在处理完所有的 Mn, 后,消息摘要是一个160位的字符串

    .1--WIRE总线

    5.15.  

    5.1 DS28E01硬件分析

    1.DS28E01:1024e2prom分四页;又称数据存储器。

    2.64位暂存器;在写入数据存储器和密钥存储器之前,先写入暂存器中,检验后存入;

    3.唯一的64ROM注册码,由工厂激活刻入芯片;前8位是1-wire家族码,中间48位是

      唯一的序列号,后8位是前56位的循环冗余检验码(CRC)

    4.64位密钥存储器;

    5.内置512SHA-1引擎,用于计算160位信息认证码(MAC)并生成密钥;

    7.寄存器页:

         TA1TA2存放写入或读取数据的目标地址;E/S用于验证数据完整性;TA1低三位始终为0,因为只接受8字节数据块;E/S低三位始终为1E/S5位说明数据有误;第346位没有功能,读出数据始终位1


    5.2 1--WIRE基本操作

    1-wire总线的基本操作分为复位,读和写三种,所有读写操作都是低位在前高位在后。

    1.复位

    在每次总线通信之前主机必须首先发送复位信号。

    产生复位信号时主机首先将总线拉低480960μs然后释放。1-Wire总线器件在接收到有效跳变的1560μs内会将总线拉低60240μs,在此期间主机可以通过对DQ采样来判断是否有从器件挂接在当前总线上。

    1.函数Reset()的返回值为0表示有器件挂接在总线上,返回值为1表示没有器件挂接在总线上。

    uchar Reset(void)

    uchar tdq;
    DQ=0; //主机拉低总线
    delay480μs(); //等待480μs
    DQ=1; //主机释放总线
    delay60μs(); //等待60μs
    tdq=DQ; //主机对总线采样
    delay480μs(); //等待复位结束
    return tdq; //返回采样值
    }

    2.写操作

    1-Wire总线写1bit至少需要60μs,同时还要保证两次连续的写操作有1μs以上的间隔。

    若待写位wbit0则主机拉低总线60μs然后释放,写0操作完成。若待写位wbit1,则主机拉低总线并在115μs内释放,然后等待60μs,写1操作完成。

    2.

    void Writebit(uchar wbit)

    _nop_(); 
    //保证两次写操作间隔1μs以上
    DQ=0;
    _nop_(); 
    //保证主机拉低总线1μs以上
    if(wbit)

    //向总线写1
    DQ=1;
    delay60μs();
    }
    else 

    //向总线写0
    delay60μs();
    DQ=1;
    }
    }

    3.读操作

    1-Wire总线读取1bit同样至少需要60μs,同时也要保证两次连续的读操作间隔1μs以上。

    3.从总线读数据时,主机首先拉低总线1μs以上然后释放,在释放总线后的115μs内主机对总线的采样值即为读取到的数据。

    uchar Readbit()

    uchar tdq;
    _nop_(); 
    //保证两次连续写操作间隔1μs以上
    DQ=0;
    _nop_(); 
    //保证拉低总线的时间不少于1μs
    DQ=1;
    _nop_();
    tdq=DQ; 
    //主机对总线采样
    delay60μs();
    //等待读操作结束
    return tdq; 
    //返回读取到的数据
    }

    5.3 ROM命令

    DS28E01内部光刻了一个长度为64bitROM编码,这个编码是器件的身份识别标志。当总线上挂接着多个DS28E01时可以通过ROM编码对特定器件进行操作。ROM功能命令是针对器件的ROM编码进行操作的命令,共有7个,长度均为8bit1Byte)。这里介绍我们用到的。

    ①读ROM(33H)

    当挂接在总线上的1-Wire总线器件接收到此命令时,会在主机读操作的配合下将自身的ROM编码按由低位到高位的顺序依次发送给主机。总线上挂接有多个时,此命令会使所有器件同时向主机传送自身的ROM编码,这将导致数据的冲突。

    ②匹配ROM(55H)

    主机在发送完此命令后,必须紧接着发送一个64bitROM编码,与此ROM编码匹配的从器件会响应主机的后续命令,而其他从器件则处于等待状态。该命令主要用于选择总线上的特定器件进行访问。

    ③跳过ROM(CCH)

    发送此命令后,主机不必提供ROM编码即可对从器件进行访问。与读ROM命令类似,该命令同样只适用于单节点的1-Wire总线系统,当总线上有多个器件挂接时会引起数据的冲突。

    ④查找ROM(F0H)

    当主机不知道总线上器件的ROM编码时,可以使用此命令并配合特定的算法查找出总线上从器件的数量和各个从器件的ROM编码。

    5.4DS28E01操作及特殊命令
        1-Wire总线相关的命令分为ROM功能命令和器件功能命令两种,ROM功能命令具有通用性,不仅适用于DS28E01也适用于其他具有1-Wire总线接口的器件,主要用于器件的识别与寻址;器件功能命令具有专用性,它们与器件的具体功能紧密相关。下面是DS28E01的器件功能命令。

    #define Wrscratch 0x0F  //写到暂存区

    #define Rescratch     0xAA     //读取暂存区

    #define Coscratch     0x55     //copy暂存区

    #define Redmemory 0xF0     //读取E2PROM,即数据存储区

    #define Loadfirse 0x5A         //将数据load到密钥存储区

    #define Comnextse 0x33     

    #define Reautpage 0xA5    //把Reautpage命令在进行身份验证,anoydisable

    #define Anautpage 0xCC    //同上,只是anoyenable,即不实用rom id

    #define Refreshsc 0xA3

    6. 关于延时

    为了减少linuxvxworks中延时的误差可能超过DS28E01所能接受的范围,我们使用的delay函数是用for循环,这个for循环是通过实验和自己计算出来的,我们这里介绍实验

    延时函数的时间时使用到的函数,当然,在linuxvxworks中是不一样的。

    vxworks中的测试函数:

      1 #include <stdio.h>

      2 

      3 int test(void)

      4 {

      5     int Count=0;

      6     int i;

      7     int  FirstTsc = pentiumTscGet64();

      8     for(i=0;i<383;i++)

      9         ;

     10     int SecondTsc = pentiumTscGet64();

     11     Count = SecondTsc-FirstTsc;

     12     printf("Count is %d\n",Count);

     13     return 0;

     14 }

    linux中的测试函数:

    #include <stdio.h>
    #include <sys/time.h>
    #define MILLION 1000000L

    void function_to_time(void);//要测试的函数

    int main(void){
    long timedif;
    struct timeval tpend; //timeval结构体包含两个成员:time_t tv_sec;Epoch开始的秒数 time_t tv_usec;Epoch开始的微秒数
    struct timeval tpstart;

    if(gettimeofday(&tpstart, NULL)){
    printf(stderr, "Failed to get start time\n");
    return 1;
    }

    function_to_time();

    if(gettimeofday(&tpend, NULL)){
    printf(stderr, "Failed to get end time\n");
    return 1;
    }

    timedif = MILLION*(tpend.tv_sec - tpstart.tv_sec) + tpend.tv_usec - tpstart.tv_usec;
    printf("The function_to_time took %ld microseconds\n", timedif);
    return 0;
    }

    展开全文
  • Linux内核加密接口分析

    千次阅读 2010-11-26 20:19:00
    将来的应用会包括:硬件加密设备驱动、内核代码签名、硬件随机数生成器、文件系统加密等。 二、如何使用加密API 1、安装 从2.6.6版本之后,内核源码就提供了丰富的密码学算法支持,需要配置编译选项...
  • 首先介绍一下注册一个驱动的步骤: 1、定义一个platform_driver结构 2、初始化这个结构,指定其probe、remove等...看platform_driver结构,定义于include/linux/platform_device.h文件中: struct platform_driver {
  • 1, linux驱动一般分为3大类: * 字符设备* 块设备* 网络设备 2, 开发环境构建: * 交叉工具链构建* NFS和tftp服务器安装 3, 驱动开发中设计到的硬件: * 数字电路知识* ARM硬件知识* 熟练使用万用表...
  • Linux设备驱动需要使用内核API来实现,一般被包含在Linux内核源码树中。...但并不是只有设备驱动才能编译成模块,有些内核功能的实现也可以,以便在需要的时候再加载,比如内核中文件系统的实现、加密及校验的
  • wpa_supplicant有部分驱动支持不完善,但支持WEP、WPA、WPA2加密。 由于WEP在现在市面的路由器中已经几乎被淘汰,因此使用wpa_supplicant进行连接。wpa_supplicant初次配置较为复杂,但配置一次后,下次遇到该AP时就...
  • 第14章 设备驱动程序 第15章 文件系统 第16章 网络系统 第17章 系统内核机制 第四篇 Linux系统高级编程 第18章 Linux内核模块编程 第19章 有关进程通信的编程 第20章 高级线程编程 第21章 Linux系统网络编程 第22章...
  • 将来的应用会包括:硬件加密设备驱动、内核代码签名、硬件随机数生成器、文件系统加密等。二、如何使用加密API1、安装从2.6.6版本之后,内核源码就提供了丰富的密码学算法支持,需要配置编译选项将加密算法作为模块...
  • 通过自动配置的临时网络进行无线加密文件传输。 无需网络基础设施(接入点,路由器,交换机)。 仅两台笔记本电脑(支持Mac,Linux和Windows)具有近距离无线芯片。 没有闪存驱动器? 无法访问无线网络或不信任...
  • Cryptopuck是一种手持设备,它将对连接到其上的任何驱动器进行加密。 当前,加密是在Raspberry Pi Zero上执行的,但是该软件应该可以在任何可以运行PythonLinux系统上运行。 该设备使用户只需将其插入Cryptopuck,就...
  • 本文提供有关如何在 Ubuntu Linux 操作系统中使用备份实用程序来备份戴尔 PC 的信息。Ubuntu备份是Ubuntu随附的简单但功能强大的备份工具。它提供rsync的功能以及增量备份、加密、计划和远程服务支持。您可以快速将...
  • drivers 这个文件分门别类的存放了各种驱动文件 firmware 固件相关 fs 里面列出了linux支持的各种文件系统(如ext4、fat、yaffs、nfs) include 存放了各种公用的头文件(与架构相关的头文件在arch\xxx\include中) ...
  • 原标题:如何从Linux命令行轻松分享文件Transfer.sh是一种简单,方便,快捷的命令行文件分享服务。 它允许您上传最多10GB的数据,文件存储14天,免费。您可以最大限度地下载,并且还支持加密以确保安全性。 它支持...
  • 您可以最大限度地下载,并且还支持加密以确保安全性。 它支持本地文件系统(本地); 与s3(亚马逊S3)和gdrive(谷歌驱动器)云存储服务一起使用。它旨在与Linux shell一起使用。 此外,您还可以在浏览器中预览文件。 在...
  • Bash脚本,用于通过磁盘加密安装Void Linux。 参考 该脚本中的大部分工作几乎直接来自于官方的。 我只是在必要时对命令进行了修改,以使其可编写脚本,并就应添加哪些其他配置/实用程序做出了许多假设/个人选择。 ...
  • 您可以最大限度地下载,并且还支持加密以确保安全性。 它支持本地文件系统(本地); 与s3(亚马逊S3)和gdrive(谷歌驱动器)云存储服务一起使用。它旨在与Linux shell一起使用。 此外,您还可以在浏览器中预览文件。 在...
  • Linux内核与文件系统分析

    千次阅读 2016-08-18 15:45:29
    1、Linux内核源代码目录结构 arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、powerpc、mips等。block:块设备驱动程序I/O调度。crypto:常用加密和散列算法(如AES、SHA等),还有...
  • 7.1.1 设备驱动文件系统的关系 7.1.2 设备类型分类 7.1.3 内核空间和用户空间.. 7.2 设备驱动基础 7.2.1 设备驱动中关键数据结构 7.2.2 字符设备驱动开发 第8章 网络设备驱动程序开发 8.1 网络设备驱动程序...
  • 加密硬盘分区是保存大量重要数据的好方法,无需经过使用GnuPG、VeraCrypt等工具的繁琐过程来单独锁定文件和文件夹,更好的是,加密整个驱动器可确保你的数据始终安全。在Linux加密硬盘驱动器分区时,没有任何应用...
  • 应用 Linux 内核中的系统调用劫持技术和模块动态装载机制,研究与开发 Linux 下的文件过滤驱动。通过对文件标识的注入与识 别,采用blowfish 加密算法,设计和实现内核级的文件加/解密服务,并对软件的性能进行分析...
  • 将来的应用会包括:硬件加密设备驱动、内核代码签名、硬件随机数生成器、文件系统加密等。二、如何使用加密API1、安装从2.6.6版本之后,内核源码就提供了丰富的密码学算法支持,需要配置编译选项将加密算法作为模块...
  • Linux下使用Intel_WiFi_Link_5100AGN 破解无线加密 <br />就是传说中的BT4破解 ㄝㄙㄩㄧㄝ回答:1 人气:16 解决时间:2010-02-24 14:55 满意答案 该网站为5100AGN 提供了支持注入的驱动升级,...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 240
精华内容 96
关键字:

linux文件加密驱动

linux 订阅