Ⅰ 这个是什么加密方式
几种加密方式
1 Base64加密方式(可逆)
Base64中的可打印字符包括字母A-Z/a-z/数组0-9/ 加号’+’斜杠’/’ 这样共有62个字符
Base64 ios7之后加入系统库
2 MD5加密
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护
是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
根据输出值,不能得到原始的明文,即其过程不可逆
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
MD5加盐
3 钥匙串加密方式
iCloud钥匙串,苹果给我们提供的密码保存的解决方案,iOS7之后有的
存沙盒:
1、如果手机越狱,密码容易被窃取。
2、当软件更新时,沙盒里的内容是不被删除的。但是,如果将软件卸载后重装,沙盒里的数据就没有了。
3、每个APP的沙盒是相对独立的,密码无法共用。
存钥匙串里:
1、苹果提供的安全方案,rsa加密,相对安全。
2、无论软件更新或删除,密码都存在,都可以自动登录。
3、同一公司的APP密码是可以共用的。
4 对称加密算法
优点:算法公开、计算量小、加密速度快、加密效率高、可逆
缺点:双方使用相同钥匙,安全性得不到保证
现状:对称加密的速度比公钥加密快很多,在很多场合都需要对称加密,
算法: 在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等。不同算法的实现机制不同,可参考对应算法的详细资料
相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准
Ⅱ IOS开发中3DES的CBC加密模式的demo,求大神帮忙啊
除非特殊需求,现在加密关键数据基本都用AES了,AES相对3DES更安全,更高效。
我给你一个AES256的ios实现(基于NSData的category):
#import"NSData+AESEncryption.h"
#import<CommonCrypto/CommonCryptor.h>
@implementationNSData(AESEncryption)
-(NSData*)AES256EncryptWithKey:(NSString*)key{
//'key'shouldbe32bytesforAES256,willbenull-paddedotherwise
charkeyPtr[kCCKeySizeAES256+1];//roomforterminator(unused)
bzero(keyPtr,sizeof(keyPtr));//fillwithzeroes(forpadding)
//fetchkeydata
[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUIntegerdataLength=[selflength];
//Seethedoc:Forblockciphers,
//.
//That'
size_tbufferSize=dataLength+kCCBlockSizeAES128;
void*buffer=malloc(bufferSize);
size_tnumBytesEncrypted=0;
CCCryptorStatuscryptStatus=CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
NULL/*initializationvector(optional)*/,
[selfbytes],dataLength,/*input*/
buffer,bufferSize,/*output*/
&numBytesEncrypted);
if(cryptStatus==kCCSuccess){
//
return[NSDatadataWithBytesNoCopy:bufferlength:numBytesEncrypted];
}
free(buffer);//freethebuffer;
returnnil;
}
-(NSData*)AES256DecryptWithKey:(NSString*)key{
//'key'shouldbe32bytesforAES256,willbenull-paddedotherwise
charkeyPtr[kCCKeySizeAES256+1];//roomforterminator(unused)
bzero(keyPtr,sizeof(keyPtr));//fillwithzeroes(forpadding)
//fetchkeydata
[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUIntegerdataLength=[selflength];
//Seethedoc:Forblockciphers,
//.
//That'
size_tbufferSize=dataLength+kCCBlockSizeAES128;
void*buffer=malloc(bufferSize);
size_tnumBytesDecrypted=0;
CCCryptorStatuscryptStatus=CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
NULL/*initializationvector(optional)*/,
[selfbytes],dataLength,/*input*/
buffer,bufferSize,/*output*/
&numBytesDecrypted);
if(cryptStatus==kCCSuccess){
//
return[NSDatadataWithBytesNoCopy:bufferlength:numBytesDecrypted];
}
free(buffer);//freethebuffer;
returnnil;
}
@end
Ⅲ ios 3des加密 32位key怎么使用
除非特殊需求,现在加密关键数据基本都用AES了,AES相对3DES更安全,更高效。
Ⅳ 如何在 Swift 中使用 CommonCrypto 类进行加密
现在,许多开发者已经不需要在 App 中进行加密处理。即使你在远程服务器上使用了 REST API,通常情况下使用 HTTPS 就可以解决大多数的安全通信问题,剩下的问题可以使用苹果提供的“保护模式”和硬件/软件加密组合方式来解决。然而在很多情况下,你还是需要对通信或文件进行加密。也许你正在把一个现有的涉及到文件/信息加密的方案移植到 iOS 上,也许你在制作一个保密性要求极高的App,或者你只是想提高数据的安全级别(这是一件好事)。
无论是哪种情况,(在iOS和OS X系统中)Cocoa 都选择 CommonCrypto 来完成任务。然而 CommonCrypto 的 API 使用的仍然是老旧的C风格(C-Style)。这种 API 已经过时了,在 Swift 中用它们非常别扭。此外,在 Swift 中用强类型属性处理 CCCrypt 中不同类型的数据(对称式加密框架的主要加密/解密功能)很不优雅。我们先来看一下 CCCrypt 的定义:
CCCrypt(op: CCOperation, alg: CCAlgorithm,
options: CCOptions,
key: UnsafePointer<Void>,
keyLength: Int,
iv: UnsafePointer<Void>,
dataIn: UnsafePointer<Void>,
dataInLength: Int,
dataOut: UnsafeMutablePointer<Void>,
dataOutAvailable: Int,
dataOutMoved: UnsafeMutablePointer<Int>)
再来看看 Objective-C(更准确来说是 C 版本的)函数声明:
CCCryptorStatus CCCrypt(
CCOperation op, // operation: kCCEncrypt or kCCDecrypt
CCAlgorithm alg, // algorithm: kCCAlgorithmAES128...
CCOptions options, // operation: kCCOptionPKCS7Padding...
const void *key, // key
size_t keyLength, // key length
const void *iv, // initialization vector (optional)
const void *dataIn, // input data
size_t dataInLength, // input data length
void *dataOut, // output data buffer
size_t dataOutAvailable, // output data length available
size_t *dataOutMoved) // real output data length generated
在 Objective-C 中,可以简单地使用预定义常量(比如“kCCAlgorithm3DES”)来定义这些参数,然后传入不同的数组和大小,完全不必担心它们的确切类型(给 size_t 参数传入 int 变量,或者给 void 参数传入 char 变量)。这不是最好的做法,但确实可以完成任务(只需要进行一些类型转换)。
但是 Swift 剔除了 Objective-C 中属于 C 的部分,因此我们需要做一些准备工作才能在 Swift 和 Cocoa 中使用 CommonCrypto。
操作(Operation)、算法(Algorithm)和设置(Options)
在 App 中对称编码是最简单的一种发送和接收加密数据的方法。这种方法只有一个密钥,它用于加密和解密操作(非对称加密则不同,它通常使用一对公-私密钥)。对称密码有许多不同的算法,所有的算法都可以有不同的设置。三个主要概念是:操作(加密/解密)、算法(DES,AES,RC4……)和设置,对应 CommonCrypto 的 CCOperation、CCAgorithm 和 CCOptions。
CCOperation、CCAgorithm 和 CCOptions 本质上就是 uint32_t(一个占32位存储的 unsigned int),所以我们可以通过 CommonCrypto 常量来构造它们:
let operation = CCOperation(kCCEncrypt)
let algorithm = CCAlgorithm(kCCAlgorithmAES)
let options = CCOptions(kCCOptionPKCS7Padding | kCCOptionECBMode)
Unsafe 指针
Swift 抽象出 Unsafe 指针来对应 C 语言的指针(C-Pointers)。Swift 试图把所有的指针和 C 风格的内存管理器都抽象出来。通常来说你不需要使用它们,除非你需要使用旧式(old-style)API(比如 CommonCrypto)。如果你真的如此不幸,那就需要学习如何处理它们:
在 Swift 中有两种类型的指针:UnsafePointers 和 UnsafeMutablePointers 类型。第一个用于常量寄存器,内存空间上的指针是恒定不变的;第二个用于可变的内存空间。对应到 C 语言,UnsafePointer 类型是”const type “缓冲类型,UnsafeMutablePointer 是”type “缓冲类型(这里的”缓冲”一词只是过去习惯的叫法)。指针的具体类型写在声明之后的<>中,所以如果你想去声明一个”void “类型的指针,需要写成:UnsafeMutablePointer 。如果要声明”const unsigned char “缓冲类型的指针,你需要使用:UnsafePointer 。虽然苹果确实提供了纯 C 类型到 Swift 类型的转换,但是一定要注意,CChar、CInt、CUnsignedLongLong…这样的类型不能直接用在 UnsafePointers 中,需要使用原生的 Swift 类型。这就出现一个问题,到底什么时候能用这些类型呢?我们需要深入一下 Swift 的类型定义:
typealias CShort = Int16
typealias CSignedChar = Int8
typealias CUnsignedChar = UInt8
typealias CUnsignedInt = UInt32
typealias CUnsignedLong = UInt
typealias CUnsignedLongLong = UInt64
typealias CUnsignedShort = UInt16
值得庆幸的是我们不需要实现 UnsafePointers 和 UnsafeMutablePointers 类型的内存管理(只要你使用的是类似 NSData 这样的 Cocoa 对象)。Swift 会自动管理(和桥接)它们。如果你需要加密/解密数据并把密钥存到 NSData 中,那就可以调用calling data.bytes 或者 data.mutableBytes 来获取对应的 UnsafePointer 和 UnsafeMutablePointer 指针。
另一种得到 UnsafePointer 变量的方式是 & 。处理输出变量时(需要内存的地址)就是通过&符号得到 Int 类型的 Unsafe(Mutable)Pointer 。我们可以在 CCCrypt 中使用这种方法把”Int”变量地址传给最后一个参数 :”dataOutMoved” 。注意:let 定义的变量对应 UnsafePointer 类型,var 变量对应 UnsafeMutablePointer 类型。
现在,我们已经拥有了调用 CCCrypt 所需的所有元素。
桥接
CommonCrypto 还没有兼容 Swift,所以为了使用它,我们需要通过头文件导入 Objective-C 形式的 CommonCrypto。
#import <CommonCrypto/CommonCrypto.h>
SymmetricCryptor类
最近我需要做对称加密的项目,为了更容易的加密和解密数据,我建了一个SymmetricCryptor 类(不要在意这个可怕的名字)。它可以把数据转换成恰当的 CommonCrypto 类型中。你可以使用它来方便的加密或解密数据。
let sc = SymmetricCryptor(algorithm: .AES128, options: CCOptions(kCCOptionPKCS7Padding))
cypher.setRandomIV()
do { let cypherText = try sc.crypt(string: clearText, key: key) } catch { print("Error while encrypting: \(error)") }
CommonCrypto 提供了多种算法和设置,不过我只想解决最常见的加密问题,因此简化了配置。比如说,使用 RC4 的时候,你可以使用 40 或者 128 位的密钥(对应的常量是 RC4_40 和 RC4_128)。同理,AES 也有一些常用的常量(128b、256b……)。因此我定义了一个名为 SymmetricCryptorAlgorithm 的枚举变量,里面定了许多常见的配置(比如 AES 256),不仅包含算法,还包含很多其他信息,比如密钥长度和块大小。
在 SymmetricCryptor 的 GitHub 页面 中,你可以看到一个对称加密/解密示例,它展示了如何简单地实现对称加密/解密。
Ⅳ ios开发金融项目都是用什么加密
多种配合。但是md5这种肯定很少用了。可以参考3des rsa blowfish等等。
Ⅵ php加密文件 解密data 转nsstring 为nil. rc4 ios
IOS:引入ios自带库 #include
先以DES加密算法为例讲解,DES的加密和解密都同用一个Key,下面两个加解密函数如下:
//加密
-(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key
{
//一般对加密的字符串采用UTF-8编码 NSData存储的就是二进制数据
NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//确定加密过后的字符串在内存中存放的大小,根据文档,对于块密码方式(这个库还包括流密码方式)
//加密过后的字符串大小总是小于或等于加密之前数据的大小加上对应加密算法的块大小
//但看到一些大牛还这样一下 & ~(kCCBlockSizeDES - 1) 目前不知道为嘛
size_t bufferSize = ([data length] + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
//void *buffer = malloc(bufferSize);//可以手动创建buffer,但之后要记得free掉
unsigned char buffer[bufferSize]; //定义输出加密串所占内存空间
memset(buffer, 0, sizeof(char)); //采用ios中宏定义好的方法分配空间,可免去手动free
size_t numBytesEncrypted = 0; //输出加密串的字节数
//加密数据,采用库中的CCCrypt方法,这个方法会按次序执行CCCrytorCreate(),
// CCCryptorUpdate(), CCCryptorFinal(), and CCCryptorRelease() 如果开发者自己create这个对象,
//那么后面就必须执行final、release之类的函数,CCCrypt方法一次性解决
// Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
//Byte iv[] = {1,2,3,4,5,6,7,8}; 加密所需的随机字符
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, //加密方式,kCCEncrypt加密 kCCDecrypt解密
kCCAlgorithmDES, //采用的加密算法,内置包含AES、DES、
//3DES、其他还有四个,不知道是什么
//后续讨论
//加密额外参数,注意此处各个平台之间指定的时候要记得一样
kCCOptionPKCS7Padding | kCCOptionECBMode,
[key UTF8String], //加密密匙 UTF8的字符串
kCCKeySizeDES, //密匙长度字节 各算法有对应的长度宏
nil, //随机字符,可指定也可不指定,各平台之间不绝对
[data bytes], //待加密串的字节长度
[data length], //待加密串的长度
buffer, //输出已加密串的内存地址
bufferSize, //已加密串的大小
&numBytesEncrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData *dataTemp = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
plainText = [GTMBase64 stringByEncodingData:dataTemp];
}else{
NSLog(@"DES加密失败");
}
return plainText;
}
//解密
-(NSString*) decryptUseDES:(NSString*)cipherText key:(NSString*)key {
// 利用 GTMBase64 解码 Base64 字串
NSData* cipherData = [GTMBase64 decodeString:cipherText];
size_t bufferSize = ([cipherData length] + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
//unsigned char buffer[1024];
unsigned char buffer[bufferSize];
memset(buffer, 0, sizeof(char));
size_t numBytesDecrypted = 0;
// IV 偏移量不需使用
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
nil,
[cipherData bytes],
[cipherData length],
buffer,
bufferSize,//1024,
&numBytesDecrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
}
return plainText;
}
java和php平台的代码实现:
Java代码 收藏代码
import java.io.IOException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class DES {
private byte[] desKey;
public DES(String desKey) {
this.desKey = desKey.getBytes();
}
public byte[] desEncrypt(byte[] plainText) throws Exception {
SecureRandom sr = new SecureRandom();
byte rawKeyData[] = desKey;
DESKeySpec dks = new DESKeySpec(rawKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key, sr);
byte data[] = plainText;
byte encryptedData[] = cipher.doFinal(data);
return encryptedData;
}
public byte[] desDecrypt(byte[] encryptText) throws Exception {
SecureRandom sr = new SecureRandom();
byte rawKeyData[] = desKey;
DESKeySpec dks = new DESKeySpec(rawKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key, sr);
byte encryptedData[] = encryptText;
byte decryptedData[] = cipher.doFinal(encryptedData);
return decryptedData;
}
public String encrypt(String input) throws Exception {
return base64Encode(desEncrypt(input.getBytes()));
}
public String decrypt(String input) throws Exception {
byte[] result = base64Decode(input);
return new String(desDecrypt(result));
}
public static String base64Encode(byte[] s) {
if (s == null)
return null;
BASE64Encoder b = new sun.misc.BASE64Encoder();
return b.encode(s);
}
public static byte[] base64Decode(String s) throws IOException {
if (s == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(s);
return b;
}
public static void main(String[] args) throws Exception {
String key = "abcdefgh";
String input = "a";
DES crypt = new DES(key);
System.out.println("Encode:" + crypt.encrypt(input));
System.out.println("Decode:" + crypt.decrypt(crypt.encrypt(input)));
}
}
php 方法一
Php代码 收藏代码
<?php
class DES1 {
var $key;
function DES1($key) {
$this->key = $key;
}
function encrypt($input) {
$size = mcrypt_get_block_size('des', 'ecb');
$input = $this->pkcs5_pad($input, $size);
$key = $this->key;
$td = mcrypt_mole_open('des', '', 'ecb', '');
$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
@mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
$data = base64_encode($data);
return $data;
}
function decrypt($encrypted) {
$encrypted = base64_decode($encrypted);
$key =$this->key;
$td = mcrypt_mole_open('des','','ecb','');
//使用MCRYPT_DES算法,cbc模式
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$ks = mcrypt_enc_get_key_size($td);
@mcrypt_generic_init($td, $key, $iv);
//初始处理
$decrypted = mdecrypt_generic($td, $encrypted);
//解密
mcrypt_generic_deinit($td);
//结束
mcrypt_mole_close($td);
$y=$this->pkcs5_unpad($decrypted);
return $y;
}
function pkcs5_pad ($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function pkcs5_unpad($text) {
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text))
return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
return false;
return substr($text, 0, -1 * $pad);
}
}
$key = "abcdefgh";
$input = "a";
$crypt = new DES1($key);
echo "Encode:".$crypt->encrypt($input)."<br/>";
echo "Decode:".$crypt->decrypt($crypt->encr
Ⅶ ios 私钥pem怎么转pkcs8
用途: pkcs8格式的私钥转换工具。它处理在PKCS#8格式中的私钥文件。它可以用多样的PKCS#5 (v1.5 and v2.0)和 PKCS#12算法来处理没有解密的PKCS#8 PrivateKeyInfo格式和EncryptedPrivateKeyInfo格式。 用法: [cpp] view plain openssl pkcs8 [-inform PEMDER] [-outform PEMDER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-topk8] [-noiter] [-nocrypt] [-nooct] [-embed] [-nsdb] [-v2 alg] [-v1 alg] [-engine id] 选项说明: -inform PEMDER::输入文件格式,DER或者PEM格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。 -outform DERPEM:输出文件格式,DER或者PEM格式。 -in filename:输入的密钥文件,默认为标准输入。如果密钥被加密,会提示输入一个密钥口令。 -passin arg:输入文件口令保护来源。 -out filename:输出文件,默认为标准输出。如果任何加密操作已经执行,会提示输入一个密钥值。输出的文件名字不能和输入的文件名一样。 -passout arg:输出文件口令保护来源。 -topk8:通常的是输入一个pkcs8文件和传统的格式私钥文件将会被写出。设置了此选项后,位置转换过来:输入一个传统格式的私钥文件,输出一个PKCS#8格式的文件。 -noiter:MAC保护计算次数为1。 -nocrypt:PKCS#8密钥产生或输入一般用一个适当地密钥来加密PKCS#8 EncryptedPrivateKeyInfo结构。设置了此选项后,一个不加密的PrivateKeyInfo结构将会被输出。这个选项一直不加密私钥文件,在绝对必要的时候才能够使用。某些软件例如一些JAVA代码签名软件使用不加密的私钥文件。 -nooct:这个选项产生的RSA私钥文件是一个坏的格式,一些软件将会使用。特别的是,私钥文件必须附上一个八位组字符串,但是一些软件仅仅包含本身的结构体没有使八位组字符串所环绕。不采用八位组表示私钥。 -embed:这个选项产生的RSA私钥文件是一个坏的格式。在私钥结构体中采用嵌入式DSA参数格式。在这个表单中,八位组字符串包含了ASN1 SEQUENCE中的两种结构:一个SEQUENCE包含了密钥参数,一个ASN1 INTEGER包含私钥值。 -nsdb:这个选项产生的RSA私钥文件是一个坏的格式并兼容了Netscape私钥文件数据库。采用NetscapeDB的DSA格式。 -v2 alg:采用PKCS#5 v2.0,并指定加密算法,默认的是PKCS#8私钥文件被叫做B<pbeWithMD5AndDES-CBC>(该算法用56字节的DES加密但是在PKCS#5 v1.5中有更加强壮的加密算法)的加密算法用口令进行加密。用B<-v2>选项,PKCS#5 v2.0相关的算法将会被使用,可以是des3(168字节)和rc2(128字节),推荐des3。 -v1 alg:采用PKCS#5 v1.5或pkcs12,并指定加密算法。可采用的算法见下面。 -engine id:指定硬件引擎。 注意: 加密了的PEM编码PKCS#8文件表单用下面的头部和尾部: -----BEGIN ENCRYPTED PRIVATE KEY----- -----END ENCRYPTED PRIVATE KEY----- 未加密的表单用: -----BEGIN PRIVATE KEY----- -----END PRIVATE KEY----- 跟传统的SSLeay算法相比,用PKCS#5 v2.0系列的算法加密私钥,有更高的安全性以及迭代次数。于是附加的安全性是经过深思熟虑的。 默认的加密算法仅仅是56字节的,是因为它是PKCS#8所支持的最好的方法。 有一些软件使用PKCS#12基于密钥的加密算法来加密PKCS#8格式的私钥:它们会自动的处理但是没有选项来操作。 在PKCS#8格式中,有可能的是输出DER编码格式的经过加密的私钥文件,是因为加密的详细说明包含在DER等级中,相反的是传统的格式包含在PEM邓丽中。 PKCS#5 v1.5和 PKCS#12 算法: 各种各样的算法可以被选项-v1所使用。包含PKCS#5 v1.5和 PKCS#12 算法。详细描述如下: B<PBE-MD2-DES PBE-MD5-DES>:这两个算法包含在PKCS#5 v1.5中。它们仅仅提供56字节的保护,加密算法用DES。 B<PBE-SHA1-RC2-64 PBE-MD2-RC2-64 PBE-MD5-RC2-64 PBE-SHA1-DES>:它们在传统的PKCS#5 v1.5中没有被提到,但是它们用同样地密钥引出算法,被一些软件所支持。在PKCS#5 v2.0中所提到。它们使用64字节的RC2以及56字节的DES。 B<PBE-SHA1-RC4-128 PBE-SHA1-RC4-40 PBE-SHA1-3DES PBE-SHA1-2DES PBE-SHA1-RC2-128 PBE-SHA1-RC2-40>:它们是PKCS#12基于密钥的加密算法,它们允许使用高强度的加密算法,例如3des或128位的RC2。 实例: 用3des算法将传统的私钥文件转换为PKCS#5 v2.0: [cpp] view plain openssl pkcs8 -in key.pem -topk8 -v2 des3 -out enckey.pem 用PKCS#5 1.5兼容的DES算法将私钥文件转换为pkcs8文件: [html] view plain openssl pkcs8 -in ocspserverkey.pem -topk8 -out ocspkcs8key.pem 用PKCS#12兼容的3DES算法将私钥文件转换为pkcs8文件: [html] view plain openssl pkcs8 -in key.pem -topk8 -out enckey.pem -v1 PBE-SHA1-3DES 读取一个DER格式加密了的PKCS#8格式的私钥: [cpp] view plain openssl pkcs8 -inform DER -nocrypt -in key.der -out key.pem 转换一个PKCS#8格式的私钥到传统的私钥: [cpp] view plain openssl pkcs8 -in pk8.pem -out key.pem pkcs8中的私钥以明文存放: [html] view plain openssl pkcs8 -in ocspserverkey.pem -topk8 -nocrypt -out ocspkcs8key.pem 标准: PKCS#5 v2.0的测试向量的实现是以通告的形式用高强度的迭代次数算法3DES、DES和RC2来加密的。很多人要确认能够解密产生的私钥。 PKCS#8格式的DSA私钥文件没有备注文件中的:在PKCS#11 v2.01中的11.9节被隐藏了的。OpenSSL的默认DSA PKCS#8私钥格式隐藏在这个标准中。 BUGs: 必须有一个选项打印使用的加密算法的其他详细细节,例如迭代次数。 PKCS#8用3DES和PKCS#5 v2.0必须是默认的私钥文件:目前为了命令的兼容性。
Ⅷ 跪求 DES跨(C# Android IOS)三个平台通用的加解密方法
#region跨平台加解密(c#安卓IOS)
//publicstaticstringsKey="12345678";
/////<summary>
/////解密
/////</summary>
/////<paramname="pToDecrypt">要解密的以Base64</param>
/////<paramname="sKey">密钥,且必须为8位</param>
/////<returns>已解密的字符串</returns>
//publicstaticstringDesDecrypt(stringpToDecrypt)
//{
////转义特殊字符
//pToDecrypt=pToDecrypt.Replace("-","+");
//pToDecrypt=pToDecrypt.Replace("_","/");
//pToDecrypt=pToDecrypt.Replace("~","=");
//byte[]inputByteArray=Convert.FromBase64String(pToDecrypt);
//using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider())
//{
//des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
//des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);
//System.IO.MemoryStreamms=newSystem.IO.MemoryStream();
//using(CryptoStreamcs=newCryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write))
//{
//cs.Write(inputByteArray,0,inputByteArray.Length);
//cs.FlushFinalBlock();
//cs.Close();
//}
//stringstr=Encoding.UTF8.GetString(ms.ToArray());
//ms.Close();
//returnstr;
//}
//}
/////<summary>
/////对字符串进行DES加密
/////</summary>
/////<paramname="sourceString">待加密的字符串</param>
/////<returns>加密后的BASE64编码的字符串</returns>
//publicstringEncrypt(stringsourceString)
//{
//byte[]btKey=Encoding.UTF8.GetBytes(sKey);
//byte[]btIV=Encoding.UTF8.GetBytes(sKey);
//DESCryptoServiceProviderdes=newDESCryptoServiceProvider();
//using(MemoryStreamms=newMemoryStream())
//{
//byte[]inData=Encoding.UTF8.GetBytes(sourceString);
//try
//{
//using(CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(btKey,btIV),CryptoStreamMode.Write))
//{
//cs.Write(inData,0,inData.Length);
//cs.FlushFinalBlock();
//}
//returnConvert.ToBase64String(ms.ToArray());
//}
//catch
//{
//throw;
//}
//}
//}
#endregion
安卓---------------------------------------------------------------------------
////加密
//(Stringmessage,Stringkey)
//throwsException{
//byte[]bytesrc=Base64.decode(message.getBytes(),Base64.DEFAULT);
//Ciphercipher=Cipher.getInstance("DES/CBC/PKCS5Padding");
//DESKeySpecdesKeySpec=newDESKeySpec(key.getBytes("UTF-8"));
//SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");
//SecretKeysecretKey=keyFactory.generateSecret(desKeySpec);
//IvParameterSpeciv=newIvParameterSpec(key.getBytes("UTF-8"));
//cipher.init(Cipher.DECRYPT_MODE,secretKey,iv);
//byte[]retByte=cipher.doFinal(bytesrc);
//returnnewString(retByte);
//}
////解密
//(Stringmessage,Stringkey)
//throwsException{
//Ciphercipher=Cipher.getInstance("DES/CBC/PKCS5Padding");
//DESKeySpecdesKeySpec=newDESKeySpec(key.getBytes("UTF-8"));
//SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");
//SecretKeysecretKey=keyFactory.generateSecret(desKeySpec);
//IvParameterSpeciv=newIvParameterSpec(key.getBytes("UTF-8"));
//cipher.init(Cipher.ENCRYPT_MODE,secretKey,iv);
//byte[]encryptbyte=cipher.doFinal(message.getBytes());
//returnnewString(Base64.encode(encryptbyte,Base64.DEFAULT));
//}
Ios--------------------------------------------------------------------------------------------------------------------
staticconstchar*encryptWithKeyAndType(constchar*text,CCOperationencryptOperation,char*key)
{
NSString*textString=[[NSStringalloc]initWithCString:textencoding:NSUTF8StringEncoding];
//NSLog(@"[[item.urldescription]UTF8String=%@",textString);
constvoid*dataIn;
size_tdataInLength;
if(encryptOperation==kCCDecrypt)//传递过来的是decrypt解码
{
//解码base64
NSData*decryptData=[GTMBase64decodeData:[textStringdataUsingEncoding:NSUTF8StringEncoding]];//转成utf-8并decode
dataInLength=[decryptDatalength];
dataIn=[decryptDatabytes];
}
else//encrypt
{
NSData*encryptData=[textStringdataUsingEncoding:NSUTF8StringEncoding];
dataInLength=[encryptDatalength];
dataIn=(constvoid*)[encryptDatabytes];
}
CCCryptorStatusccStatus;
uint8_t*dataOut=NULL;//可以理解位type/typedef的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)
size_tdataOutAvailable=0;//size_t是操作符sizeof返回的结果类型
size_tdataOutMoved=0;
dataOutAvailable=(dataInLength+kCCBlockSizeDES)&~(kCCBlockSizeDES-1);
dataOut=malloc(dataOutAvailable*sizeof(uint8_t));
memset((void*)dataOut,00,dataOutAvailable);//将已开辟内存空间buffer的首1个字节的值设为值0
//NSString*initIv=@"12345678";
constvoid*vkey=key;
constvoid*iv=(constvoid*)key;//[initIvUTF8String];
//CCCrypt函数加密/解密
ccStatus=CCCrypt(encryptOperation,//加密/解密
kCCAlgorithmDES,//加密根据哪个标准(des,3des,aes。。。。)
kCCOptionPKCS7Padding,//选项分组密码算法(des:对每块分组加一次密3DES:对每块分组加三个不同的密)
vkey,//密钥加密和解密的密钥必须一致
kCCKeySizeDES,//DES密钥的大小(kCCKeySizeDES=8)
iv,//可选的初始矢量
dataIn,//数据的存储单元
dataInLength,//数据的大小
(void*)dataOut,//用于返回数据
dataOutAvailable,
&dataOutMoved);
NSString*result=nil;
if(encryptOperation==kCCDecrypt)//encryptOperation==1解码
{
//得到解密出来的data数据,改变为utf-8的字符串
result=[[NSStringalloc]initWithData:[NSDatadataWithBytes:(constvoid*)dataOutlength:(NSUInteger)dataOutMoved]encoding:NSUTF8StringEncoding];
}
else//encryptOperation==0(加密过程中,把加好密的数据转成base64的)
{
//编码base64
NSData*data=[NSDatadataWithBytes:(constvoid*)dataOutlength:(NSUInteger)dataOutMoved];
result=[GTMBase64stringByEncodingData:data];
}
return[resultUTF8String];
}
+(NSString*)encryptWithContent:(NSString*)contenttype:(CCOperation)typekey:(NSString*)aKey
{
constchar*contentChar=[contentUTF8String];
char*keyChar=(char*)[aKeyUTF8String];
constchar*miChar;
miChar=encryptWithKeyAndType(contentChar,type,keyChar);
return[NSStringstringWithCString:miCharencoding:NSUTF8StringEncoding];
}
Ⅸ ios des加密 用的什么形式
最常用的是MD5和base64编码,还有DES 3DES AES加密
u