導航:首頁 > 文檔加密 > ios3des加密

ios3des加密

發布時間:2022-02-21 07:43:55

Ⅰ 這個是什麼加密方式

幾種加密方式
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

閱讀全文

與ios3des加密相關的資料

熱點內容
伺服器怎麼用不會斷電 瀏覽:298
主從伺服器有什麼用 瀏覽:213
jstlpdf 瀏覽:14
安卓原神在哪個app下載 瀏覽:808
單片機編程技術什麼意思 瀏覽:104
e點課堂源碼 瀏覽:45
免費打擊墊app哪個好 瀏覽:532
程序員必裝的6款軟體 瀏覽:750
基於單片機的遙控器設計 瀏覽:521
安卓如何取消圓圖標 瀏覽:11
收件伺服器怎麼樣 瀏覽:48
建築設計規范pdf 瀏覽:98
如何合並兩個pdf 瀏覽:174
刷機包必須要解壓的單詞 瀏覽:483
android課表實現 瀏覽:864
頭條app在哪裡能看見有什麼活動 瀏覽:511
冰櫃壓縮機電容80歐 瀏覽:609
安卓各個版本圖標什麼樣 瀏覽:152
無錫哪裡有製作手機app 瀏覽:538
php字元串轉json數組 瀏覽:6