树莓派定时任务

https://www.kawabangga.com/posts/1398

Linux下有一个定时运行的程序命令叫“crontab”,是任务调度的crond常驻命令,是Linux系统下的定时任务触发器 。
限制用户使用crontab的文件有:/etc/cron.allow /etc/cron.deny 。
当使用crontab建立工作排程后,将被记录到/var/spool/cron里。
cron执行的每一项工作都被记录到/varlog/cron里去。
crontab参数:
-u:只有root才可能,帮其他用户建立或移除工作排程。
-l:查阅crontab的工作内容
-r:移除所有的crontab的工作内容,移除一项,用-e编辑。
每项工作有六个字段分别是:
分钟 小时 日期 月份 周 指令
0-59 0-23 1-31 1-12 0-7 指令 #0和7都代表星期天
辅助特殊字符:

  • (星号)代表任何时刻
    ,(逗号)代表分隔时候。如3点与6点 就是3,6
    -(减号)代表一段时间范围内。如:3点到6点 就是3-6
    /n(斜线)n代表数字,即每隔n单位。如每隔五分钟,/5
    以下我们举个例子,比如每晚定时23:50分需要关机
    1.编辑crontab 任务:
    $crontab -e
    2.再文件的最后一行添加以下这行内容:
    50 23 * * * /sbin/shutdown -h now

注:50 23 代表 每天的23:50,执行的命令就是“shutdown -h now”

crontab命令
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

使用说明
只有root用户和crontab文件的所有者才能编辑定时任务,因此如果以pi用户登录,不要忘记加上sudo。-e参数表示编辑(edit)。
sudo crontab -e
进入编辑以后需要按照一定的格式写入所需执行的命令和重复的时间。格式如下:
m h dom mon dow command
依次是分钟(minute)、小时(hour)、几号(day of month)、月份(month)、星期几(day of week)、命令。
时间可以是一个数字,表示在这个时刻执行,也可以是星号(*),表示不做限制、在任意时刻都执行。
查看所有的定时任务可以使用-l参数,表示列出(list)的含义
crontab -l

用法举例
每天0点1分执行贴吧签到脚本
1 0 * * * python qiandao.py
在每周日的7点更新系统
0 7 * * 1 apt-get update && sudo apt-get upgrade -y

2018/11/28 posted in  Raspbian

Mac OSX下给树莓派安装Raspbian系统

2018/11/26 posted in  Raspbian

iOS获取App ipa包以及资源文件

LINK:https://www.jianshu.com/p/fdb50d303ad6

要获得线上APP的ipa文件,现在有以下几种方案
1.通过PP助手下载安装到手机的应用
2.通过iTools助手下载安装到手机的应用
3.通过Apple Configurator 2(Mac商店)获取
前两种方案网上的教程很多,这里只介绍第三种方案

首先 去Mac上的App Store下载Apple Configurator 2。
然后把iphone连接上Mac,点击Apple Configurator 2 菜单中->账户->登陆(用连接设备的Apple ID)

打开登录.png

备份iPhone的内容(避免数据丢失,非必选)

所有设备->选中当前iPhone->添加->应用,找到您想要ipa的那个应用->添加

添加应用.png

添加.png

下载ipa包中.png
因为你手机中已经存在了当前应用,所以会提示,该应用已经存在, 是否需要替换?
此时,不要点任何按钮!不要点任何按钮!不要点任何按钮!

不要点击任何按钮.png
不要操作Apple Configurator 2,让它保持上图的状态,然后打开Finder前往文件夹,或者直接快捷键command+shift+G
并输入下面路径
~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/

前往文件夹.png

前往文件夹2.png
点击前往,打开ipa包所在文件。将ipa文件copy出来。

获取ipa包所在文件夹.png
这时候别忘了点击Apple Configurator 2窗口中的停止,你会发现刚才目录下的文件也消失了

拿到ipa文件后,你可以将后缀.ipa改为.zip,然后解压


修改文件类型.png

就可以看到Payload下的包,显示包内容可以看到部分APP的资源以及Assets.car。

解压.png
如果你要解压Assets.car, 可以使用github上的工具https://github.com/pcjbird/AssetsExtractor

最后,提取出来的资源文件,大家要注意版权,仅供参考,不要直接拿来商业使用。

2018/11/13 posted in  杂七杂八

iOS RSA加密 以及生成公钥 秘钥 pem文件

在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于解密. 首先需要先生成这些文件,然后再将文件导入工程使用,不多说,开始做!
一、使用openssl生成所需秘钥文件
  生成环境是在mac系统下,使用openssl进行生成,首先打开终端,按下面这些步骤依次来做:

  1. 生成模长为1024bit的私钥文件private_key.pem

openssl genrsa -out private_key.pem 1024

  1. 生成证书请求文件rsaCertReq.csr
    openssl req -new -key private_key.pem -out rsaCerReq.csr
    注意:这一步会提示输入国家、省份、mail等信息,可以根据实际情况填写,或者全部不用填写,直接全部敲回车.
  2. 生成证书rsaCert.crt,并设置有效时间为10年
    openssl x509 -req -days 3650 -in rsaCerReq.csr -signkey private_key.pem -out rsaCert.crt
  3. 生成供iOS使用的公钥文件public_key.der
    openssl x509 -outform der -in rsaCert.crt -out public_key.der
  4. 生成供iOS使用的私钥文件private_key.p12
    openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
    注意:这一步会提示给私钥文件设置密码,直接输入想要设置密码即可,然后敲回车,然后再验证刚才设置的密码,再次输入密码,然后敲回车,完毕!
    在解密时,private_key.p12文件需要和这里设置的密码配合使用,因此需要牢记此密码.
  5. 生成供Java使用的公钥rsa_public_key.pem
    openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
  6. 生成供Java使用的私钥pkcs8_private_key.pem
    openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt
    全部执行成功后,会生成如下文件,其中public_key.der和private_key.p12就是iOS需要用到的文件
2018/10/10 posted in  Crypto

使用openssl命令制作ecc证书

# openssl ecparam -out EccCA.key -name prime256v1 -genkey
# openssl req -config openssl.cnf -key EccCA.key -new -out EccCA.req
# openssl x509 -req -in EccCA.req -signkey EccCA.key -out EccCA.pem
# openssl ecparam -out EccSite.key -name prime256v1 -genkey
# openssl req -config openssl.cnf -key EccSite.key -new -out EccSite.req
# openssl x509 -req -in EccSite.req -CA EccCA.pem -CAkey EccCA.key -out EccSite.pem -CAcreateserial

生成几张用户证书,然后用openssl pkcs12命令生成p12格式证书文件,然后导入到firefox中。
生成证书时,ECC曲线选择的是prime256v1。之前有选过prime192v1,好像firefox不认,改了种曲线就好了。
生成站点证书或用户证书时,也可以用ECC根证书颁发RSA证书,测试一样能通过。

将私钥秘cer证书合并成p12格式

1)生成pkcs12文件,但不包含CA证书:

openssl pkcs12 -export -inkey ocspserverkey.pem -in ocspservercert.pem -out ocspserverpkcs12.pfx

2) 生成pcs12文件,包含CA证书:

openssl pkcs12 -export -inkey server.key -in server.crt -CAfile ca.crt -chain -out server.pfx

3) 将pcks12中的信息分离出来,写入文件:

openssl pkcs12 –in ocsp1.pfx -out certandkey.pem

4) 显示pkcs12信息:

openssl pkcs12 –in ocsp1.pfx -info


附: 1、把cert1.pem转换成.p12格式

openssl pkcs12 -export -in cert1.pem -inkey cert1.key -certfile ca.pem -out cert1.p12

2、把cert1.pem转换成.cer格式:只需把扩展名改为.cer即可.

2018/10/10 posted in  Crypto

关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商)

ECC:Elliptic Curves Cryptography,椭圆曲线密码编码学
ECDSA:用于数字签名,是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。
ECDH:是基于ECC(Elliptic Curve Cryptosystems,椭圆曲线密码体制,参看ECC)的DH( Diffie-Hellman)密钥交换算法。交

重点说一下,ECDH用途:
由于通过ECDH,双方可以在不共享任何秘密的前提下协商出一个共享秘密,因此,ECDH广泛用于协议之中,通过ECDH得到对称加密密钥。如TLS中的ECDH密码套件。使用DH算法的协议,都可以升级到ECDH算法。ECDH具有ECC的高强度、短密钥长度、计算速度快等优点。

密钥交换过程:
假设密钥交换双方为Alice、Bob,其有共享曲线参数(椭圆曲线E、阶N、基点G)。
1.Alice生成随机整数a,计算A=a*G。Bob生成随机整数b,计算B=b*G
2.Alice将A传递给Bob。A的传递可以公开,即攻击者可以获取A。由于椭圆曲线的离散对数问题是难题,所以攻击者不可以通过A、G计算出a。Bob将B传递给Alice。同理,B的传递可以公开。
3.Bob收到Alice传递的A,计算Q=b*A
4.Alice收到Bob传递的B,计算Q‘=a*B总结:
  Alice、Bob双方即得Q=b*A=b*(a*G)=(b*a)*G=(a*b)*G=a*(b*G)=a*B=Q (交换律和结合律),即双方得到一致的密钥Q。

2018/10/10 posted in  Crypto

基于Crypto++密码库的ECIES和ECDSA算法的联合使用

Auteur:GX
CSDN:GuoXuan_CHN

#include <iostream>

#include "eccrypto.h"
#include "osrng.h"
#include "oids.h"
#include "hex.h"
#include "filters.h"

#ifndef ECC_ENCRYPTION_ALGORITHM_H_
#define ECC_ENCRYPTION_ALGORITHM_H_

#include<string>

class EccEncryption
{
public:
    /// This method is used to generate keys for ECC encryption algorithm
    ///
    ///  \param[in]  uiKeySize, length of key
    /// \param[out]  sPrivateKey, private key
    /// \param[out]  sPublicKey, public key
    void GenerateEccKeys(unsigned int uiKeySize, std::string& sPrivateKey, std::string& sPublicKey);

    /// This method is used to encrypt the input message using public key
    ///
    ///  \param[in]  sPublicKey, public key generated by the first method
    /// \param[out]  sMsgToEncrypt, message to encryppt
    /// \return  the message encrypted using the input public key
    std::string Encrypt(const std::string& sPublicKey, const std::string& sMsgToEncrypt);

    /// This method is used to decrypt the input message using private key
    ///
    /// \param[in] sPrivateKey, private key used to decrypt the cipher text
    /// \param[in] sMsgToDecrypt, cipher text used to decrypt to get the plain text
    /// \return decrypted plain text
    std::string Decrypt(const std::string& sPrivateKey, const std::string& sMsgToDecrytp);
};
#endif

void EccEncryption::GenerateEccKeys(unsigned int uiKeySize, std::string& sPrivateKey, std::string& sPublicKey)
{
    using namespace CryptoPP;
    // Random pool, the second parameter is the length of key
    // 随机数池,第二个参数是生成密钥的长
    AutoSeededRandomPool rnd(false, 256);

    ECIES<ECP>::PrivateKey  privateKey;
    ECIES<ECP>::PublicKey   publicKey;

    // Generate private key
    privateKey.Initialize(rnd, ASN1::secp256r1());
    // Generate public key using private key
    privateKey.MakePublicKey(publicKey);

    ECIES<ECP>::Encryptor encryptor(publicKey);
    HexEncoder pubEncoder(new StringSink(sPublicKey));
    publicKey.DEREncode(pubEncoder);
    pubEncoder.MessageEnd();

    ECIES<ECP>::Decryptor decryptor(privateKey);
    HexEncoder prvEncoder(new StringSink(sPrivateKey));
    privateKey.DEREncode(prvEncoder);
    prvEncoder.MessageEnd();
}

std::string EccEncryption::Encrypt(const std::string& sPublicKey, const std::string& sMsgToEncrypt)
{
    using namespace CryptoPP;
    // If to save the keys into a file, FileSource should be replace StringSource
    StringSource pubString(sPublicKey, true, new HexDecoder);
    ECIES<ECP>::Encryptor encryptor(pubString);

    // Calculate the length of cipher text
    size_t uiCipherTextSize = encryptor.CiphertextLength(sMsgToEncrypt.size());
    std::string sCipherText;
    sCipherText.resize(uiCipherTextSize);
    RandomPool rnd;
    encryptor.Encrypt(rnd, (byte*)(sMsgToEncrypt.c_str()), sMsgToEncrypt.size(), (byte*)(sCipherText.data()));
    return sCipherText;
}

std::string EccEncryption::Decrypt(const std::string& sPrivateKey, const std::string& sMsgToDecrytp)
{
    using namespace CryptoPP;
    StringSource privString(sPrivateKey, true, new HexDecoder);
    ECIES<ECP>::Decryptor decryptor(privString);

    auto sPlainTextLen = decryptor.MaxPlaintextLength(sMsgToDecrytp.size());
    std::string sDecryText;
    sDecryText.resize(sPlainTextLen);
    RandomPool rnd;
    decryptor.Decrypt(rnd, (byte*)sMsgToDecrytp.c_str(), sMsgToDecrytp.size(), (byte*)sDecryText.data());
    return sDecryText;
}

int main()
{
    std::string sStrToTest = std::string("Hello world. This is an example of Ecc encryption algorithm of Crypto++ open source library.");
    EccEncryption ecc;
    std::string sPrivateKey, sPublicKey;
    ecc.GenerateEccKeys(1024, sPrivateKey, sPublicKey);

    std::cout << "Generated private key is : "<< std::endl;
    std::cout << sPrivateKey << std::endl;
    std::cout << "***********************************************************" << std::endl;

    std::cout << "Generated public key is : "<< std::endl;
    std::cout << sPublicKey << std::endl;
    std::cout << "***********************************************************" << std::endl;

    std::cout << "The message to be encrypted is : " << std::endl;
    std::cout << sStrToTest << std::endl;
    std::cout << "***********************************************************" << std::endl;

    std::string sEncryptResult = ecc.Encrypt(sPublicKey, sStrToTest);
    std::cout << "The result of encrypt is : " << std::endl;
    std::cout << sEncryptResult << std::endl;
    std::cout << "***********************************************************" << std::endl;

    std::string sDecryptResult = ecc.Decrypt(sPrivateKey, sEncryptResult);
    std::cout << "The result of decrypt is : " << std::endl;
    std::cout << sDecryptResult << std::endl;
    std::cout << "***********************************************************" << std::endl;

    return 0;
}

ECIES-ECSDSA联合使用Demo

/*
auteur:GX
CSDN:GuoXuan_CHN
*/
#include <fstream>
#include <string>
#include <iostream>

#include "eccrypto.h"
#include "osrng.h"
#include "oids.h"
#include "hex.h"
#include "filters.h"
#include "des.h"

using namespace std;

 CryptoPP::ECIES<CryptoPP::ECP>::PrivateKey  ePrivateKey;
 CryptoPP::ECIES<CryptoPP::ECP>::PublicKey   ePublicKey;
string sPrivateKey, sPublicKey;


void GenerateEccKeys()
{
    using namespace CryptoPP;

    // Random pool, the second parameter is the length of key
    // 随机数池,第二个参数是生成密钥的长
    AutoSeededRandomPool rnd(false, 256);


    // Generate private key
    // 生成私钥
    ePrivateKey.Initialize(rnd, ASN1::secp256r1());

    // Generate public key using private key
    // 用私钥生成密钥
    ePrivateKey.MakePublicKey(ePublicKey);


    HexEncoder pubEncoder(new StringSink(sPublicKey));
    ePublicKey.DEREncode(pubEncoder);
    pubEncoder.MessageEnd();

    HexEncoder prvEncoder(new StringSink(sPrivateKey));
    ePrivateKey.DEREncode(prvEncoder);
    prvEncoder.MessageEnd();
}

string signe (string message)
{
    std::string signature="";

    //数字签名过程
    CryptoPP::ECDSA<CryptoPP::ECP, CryptoPP::SHA1>::PrivateKey privateKey;
    std::string exp = sPrivateKey.substr(70);

    CryptoPP::HexDecoder decoder;
    decoder.Put((CryptoPP::byte *)&exp[0], exp.size());
    decoder.MessageEnd();

    CryptoPP::Integer x;
    x.Decode(decoder, decoder.MaxRetrievable());

    privateKey.Initialize(CryptoPP::ASN1::secp256r1(), x);

    CryptoPP::ECDSA<CryptoPP::ECP, CryptoPP::SHA1>::Signer signer( privateKey );

    CryptoPP::AutoSeededRandomPool prng;

    //签名结果
    signature = "";

    CryptoPP::StringSource s( message, true /*pump all*/,
                             new  CryptoPP::SignerFilter( prng,
                                                         signer,
                                                         new  CryptoPP::StringSink( signature )
                                                         ) // SignerFilter
                             ); // StringSource

    return signature;
    //签名过程结束
}

bool VerifierSignature(string signature,string message)
{
    std::string pt="";

    //验签过程
    CryptoPP::ECDSA<CryptoPP::ECP, CryptoPP::SHA1>::PublicKey publicKey;

    pt = sPublicKey.substr(54);

    CryptoPP::HexDecoder decoder;
    decoder.Put((CryptoPP::byte *)&pt[0], pt.size());
    decoder.MessageEnd();

    CryptoPP::ECP::Point q;
    size_t len = decoder.MaxRetrievable();

    q.identity = false;
    q.x.Decode(decoder, len/2);
    q.y.Decode(decoder, len/2);

    publicKey.Initialize( CryptoPP::ASN1::secp256r1(), q );

    CryptoPP::ECDSA<CryptoPP::ECP,CryptoPP::SHA1>::Verifier verifier(publicKey);

    // Result of the verification process
    bool result = false;

    CryptoPP::StringSource ss( signature+message, true /*pump all*/,
                              new CryptoPP::SignatureVerificationFilter(
                                                                        verifier,
                                                                        new CryptoPP::ArraySink((CryptoPP::byte *)&result, sizeof(result) )
                                                                        )
                              );
    return result;
}

int main()
{
    std::string message = "Yoda said, Do or do not. There is no try.";
    std::string signature="";
    bool result = false;

    GenerateEccKeys();

    signature = signe (message);

    result = VerifierSignature(signature,message);
    cout << "****** tester la bon*****" << endl;
    cout << result << endl;

    result = VerifierSignature(signature,"1234567890");
    cout << "****** tester la mauvais*****" << endl;
    cout << result << endl;

}
2018/10/8 posted in  Bitcoin

iOS - ECC椭圆曲线、ECDSA签名验签和ECIES加解密

前言

ECC英文全称"Ellipse Curve Cryptography",与传统的基于大质数因子分解困难性的加密方法不同,ECC通过椭圆曲线方程式的性质产生密钥

ECC164位的密钥产生一个安全级,相当于RSA 1024位密钥提供的保密强度,而且计算量较小,处理速度更快,存储空间和传输带宽占用较少。目前我国居民二代身份证正在使用 256 位的椭圆曲线密码,虚拟货币比特币也选择ECC作为加密算法。

加密

基于这个秘密值,用来对Alice和Bob之间的报文进行加密的实际方法是适应以前的,最初是在其他组中描述使用的离散对数密码系统。这些系统包括:

Diffie-Hellman—ECDH

MQV—ECMQV

ElGamal discrete log cryptosystem—ECElGamal

数字签名算法—ECDSA

对于ECC系统来说,完成运行系统所必须的群操作比同样大小的因数分解系统或模整数离散对数系统要慢。不过,ECC系统的拥护者相信ECDLP问题比DLP或因数分解问题要难的多,并且因此使用ECC能用小的多的密钥长度来提供同等的安全,在这方面来说它确实比例如RSA之类的更快。到目前为止已经公布的结果趋于支持这个结论,不过一些专家表示怀疑。

ECC被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。

优点

安全性高

有研究表示160位的椭圆密钥与1024位的RSA密钥安全性相同。

处理速度快

在私钥的加密解密速度上,ecc算法比RSA、DSA速度更快。
存储空间占用小。
带宽要求低。
以上为ECC椭圆曲线算法需要了解的基本知识,摘自强大的百科度娘。

iOS-ECC

关于ECC,苹果支持以下算法:

PKG:

curves P-224, P-256, P-384, P-521

PKV:

curves P-224, P-256, P-384, P-521

Signature Generation:

curves P-224, P-256, P-384, P-521

using (SHA-224, SHA-256, SHA384, SHA512)

Signature Verification:

curves P-224, P-256, P-384, P-521

using (SHA-1, SHA-224, SHA-256, SHA384, SHA512)

采用的都是NIST标准和规范。但是苹果官方API仅为开发者提供了椭圆曲线P-256的256位EC密钥。由于苹果SEP硬件提供的保护机制,私钥会直接以keychain的形式截留在SEP中,不能提取,也不能从外部导入,只能通过引用使用。

ECDSA

椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟,下面是关于ECDSA的API调用。

1、创建ECC椭圆曲线的keychain属性,属性设置具体可以根据自己需要,获取ECC私钥。

sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,  
                                             kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,  
                                             // kSecAccessControlTouchIDAny |  
                                             kSecAccessControlPrivateKeyUsage, &error);  
    
 // Create parameters dictionary for key generation.  
 NSDictionary *parameters = @{  
                              (id)kSecAttrTokenID: (id)kSecAttrTokenIDSecureEnclave,  
                              (id)kSecAttrKeyType: (id)kSecAttrKeyTypeECSECPrimeRandom,  
                              (id)kSecAttrKeySizeInBits: @256,  
                              (id)kSecAttrLabel: @"my-se-key",  
                              (id)kSecPrivateKeyAttrs: @{  
                                      (id)kSecAttrAccessControl: (__bridge_transfer id)sacObject,  
                                      (id)kSecAttrIsPermanent: @YES,  
                                      }  
                              };
NSError *gen_error = nil;
//根据参数生成私钥
id privateKey = CFBridgingRelease(SecKeyCreateRandomKey((__bridge CFDictionaryRef)parameters, (voidvoid *)&gen_error));
2.使用私钥提取公钥,并用于签名。

//根据keychain的属性查找ECC私钥,并获取私钥引用。

NSDictionary *params = @{
 
(id)kSecClass: (id)kSecClassKey, (id)kSecAttrKeyType: (id)kSecAttrKeyTypeECSECPrimeRandom, (id)kSecAttrKeySizeInBits: @256, (id)kSecAttrLabel: @"my-se-key", (id)kSecReturnRef: @YES, (id)kSecUseOperationPrompt: @"Authenticate to sign data" };

SecKeyRef privateKey;  
      OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)params, (CFTypeRef *)&privateKey);
     
 ```
3.签名

NSError *error;

NSData *dataToSign = [@"我是签名内容" dataUsingEncoding:NSUTF8StringEncoding];

NSData *signature = CFBridgingRelease(SecKeyCreateSignature(privateKey, kSecKeyAlgorithmECDSASignatureMessageX962SHA256, (CFDataRef)dataToSign, (voidvoid *)&error));

对于kSecKeyAlgorithmECDSASignatureMessageX962SHA256签名算法,官方还给了:SHA1、SHA224、SHA384、SHA512用于EC密钥摘要。可以自己需求选择签名对应的摘要算法。API的名字也很明确的给了这里执行的标准规范为X9.62。

4.验签

//提取公钥,进行验签,验签选择的算法必须与签名时的算法一致。

id publicKey = CFBridgingRelease(SecKeyCopyPublicKey((SecKeyRef)privateKey));

Boolean verified = SecKeyVerifySignature((SecKeyRef)publicKey, kSecKeyAlgorithmECDSASignatureMessageX962SHA256, (CFDataRef)dataToSign, (CFDataRef)signature, (void *)&error); if (verified == 1) { message = [NSString stringWithFormat:@"signature:%@ verified:%@ error:%@", signature, @"验签成功", error]; }else{ message = [NSString stringWithFormat:@"signature:%@ verified:%@ error:%@", signature, @"验签失败", error]; }


##ECIES
校验密钥是否和算法是否匹配,只有都符合条件了才能用于加密。

SecKeyAlgorithm algorithm = kSecKeyAlgorithmECIESEncryptionCofactorX963SHA256AESGCM;

BOOL canEncrypt = SecKeyIsAlgorithmSupported((SecKeyRef)publicKey,kSecKeyOperationTypeEncrypt, algorithm);

加密

CFErrorRef error = NULL;

cipherText = (NSData*)CFBridgingRelease( // ARC takes ownership

SecKeyCreateEncryptedData(publicKey,

algorithm,

(__bridge CFDataRef)encryptionData,&error));

                                                                     

encryptionData为要加密的数据,这里提示一下:

As an additional check before encrypting, because asymmetric encryption restricts the length of the data that you can encrypt, verify that the data is short enough. For this particular algorithm, the plain text data must be 130 bytes smaller than the key’s block size, as reported by SecKeyGetBlockSize. You therefore further condition the proceedings on a length test:

NSData* plainText = ;
canEncrypt &= ([plainText length] < (SecKeyGetBlockSize(publicKey)-130));


官方API描述,明文数据要比密钥块小130个字节。

解密

CFErrorRef error = NULL;

clearText = (NSData*)CFBridgingRelease( // ARC takes ownership

SecKeyCreateDecryptedData(private,

algorithm,

(__bridge CFDataRef)cipherText,

                        
                                                            

https://developer.virgilsecurity.com/docs/sdk-and-tools

https://medium.com/@edisonlo/objective-c-digital-signature-signing-and-verification-with-pem-der-or-base64-string-aff4c0a7f805

https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html

https://forums.developer.apple.com/thread/87758



PUBLIC_KEY = "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESJCvH4lEoGgLof637UGdAYHwFW0GddD/DbVu8yFVTt5Zq+kkftDpQDelSnhmmbr9v+ZsIESINctknP3LTbeLIg==";
PRIVATE_KEY = "MIGNAgEAMBAGByqGSM49AgEGBSuBBAAKBHYwdAIBAQQgi5h75Y80gEeJQQZ6zq7zjT9a11lyLhf9kF/ItIGFDHCgBwYFK4EEAAqhRANCAARIkK8fiUSgaAuh/rftQZ0BgfAVbQZ10P8NtW7zIVVO3lmr6SR+0OlAN6VKeGaZuv2/5mwgRIg1y2Sc/ctNt4si";
    

2018/9/30 posted in  Bitcoin

Pyhton3一则下载代码

2018/9/30 posted in  Python

Python中关于“warning: Debugger speedups using cython not found”问题的解决

2018/9/30 posted in  Python