zoukankan      html  css  js  c++  java
  • AES-NI指令集

    对于intel的AES-NI新指令集,需要i5处理器及以上的相关硬件支持.在编译时,可能会出现

    /usr/lib/gcc/x86_64-linux-gnu/4.8/include/wmmintrin.h:34:3: error: #error "AES/PCLMUL instructions not enabled"

    很显然,可以通过查其头文件,定位到

    #if !defined (__AES__) && !defined (__PCLMUL__)
            # error "AES/PCLMUL instructions not enabled"
        #else

    那么,很明显是因为没有定义两个宏.问题正因找到了,怎么解决呢?

    对于gcc/g++编译器,需要添加编译选项-maes和-mpclmul;

    对于vs系列,根据microsoft官网介绍,最低版本要求为visual studio 2010及以上

    而对于下列问题:

    error: request for member ‘m128i_u64’ in ‘a’, which is of non-class type ‘__m128i {aka __vector(2) long long int}’
    a.1] = 0x8899AABBCCDDEEFF;(其中__m128i a;)

    主要是对于变量a,在vs2010中,存在结构体成员a.m128i_u64[0],a.m128i_u64[1],而对于gcc/g++,存在a[0],a[1].这一点需要注意的.

    下面是几个问题,也许你在学习中会遇到,现总结如下:

    1.如何判断当前系统是否支持aes-ni指令集?

    方法一:

    $ sort -u /proc/crypto | grep module

    module : aesni_intel
    module : aes_x86_64
    module : arc4
    module : crc32_pclmul
    module : crct10dif_pclmul
    module : ghash_clmulni_intel
    module : kernel

    方法二:对于这个方法,需要安装cpuid。

    $ cpuid | grep -i aes

      AES instruction = true
    AES instruction = true
    AES instruction = true
    AES instruction = true

    附文:

    查看cpu信息

    $ cat /proc/cpuinfo 

    $ lscpu

    方法三:intel官网说这种方法不太可靠

    $ cat /proc/cpuinfo| grep aes
    $
    grep aes /proc/cpuinfo
    flags: ***** aes *****

    2.linux下openssl使用aes-ni与否,对数据处理的速度比较?

    aes-ni demo

    $ openssl speed -elapsed -evp aes-128-cbc
    $ OPENSSL_ia32cap="~0x200000200000000" openssl speed -elapsed -evp aes-128-cbc

    openssl支持aes-ni指令集,但并没有将其作为一个engine.因此,为了支持aes-ni指令集,在openssl中需要添加

    -evp (“envelope”) mode模块.

    3.#error "SSE4.1 instruction set not enabled"或者说如何添加SSE4.1指令集?

    给gcc或者g++编译器添加flags: -march=native or -msse2 / -msse3 / -mssse3 / -msse4.1 

    注意:使用-march=native编译选项时,编译器会根据处理器选择最好的CPU架构和flags。或者对于distcc,直接食用-march=corei7 -mavx -mpclmul。

    CFLAGS+=  -msse4.1

    通过以上总结:
    $ g++ -std=c++11 -maes -mpclmul -msse4.1 main.cpp -o main
    $ g++ -Wall -std=c++11 -march=native main.cpp -o main


    4.Debian/Ubuntu安装openssl及开发库
    $ sudo apt-get install opensll
    libssl-dev
    在ubuntu14.0下libssl.so和libcrypto.so位于/lib/x86_64-linux-gnu,默认的linux共享库搜索路径为/lib和/usr/lib两个目录(不包含子目录),
    若共享库不在这两个路径,不能自动连接到(最典型的就是/usr/local/lib)。
    所以提供一种通用方法:修改系统文件/etc/ld.so.conf,添加路径,运行ldconfig命令。
  • 相关阅读:
    Unity3d热更新全书-加载(一)从AssetBundle说起
    Unity3D热更新全书-脚本(三) C#LightEvil语法与调试
    Unity3D热更新全书-脚本(二) 两级分化
    Unity3D热更新全书-脚本(一) 初识脚本
    Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
    C#Light/Evil合体啦
    C#最良心脚本语言C#Light/Evil,XamarinWP8Unity热更新最良心方案,再次进化.
    C#Light 再推荐,顺便介绍WP8 功能展示项目
    任意两张带透明图像的一种形状过渡效果
    FileFilter
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/6572104.html
Copyright © 2011-2022 走看看