2017-04-04 22 views
0

DES를 사용하여 iOS 앱에서 문자열을 암호화하고 해독하고 싶습니다 (예, DES가 더 이상 안전하지 않지만 앱이 수신하여 BLE 모듈에 메시지를 보내고 싶습니다. 사용). 나는 성공적으로 공통 암호화를위한 브리지 헤더를 생성하고 난 암호화를 위해이를 발견하고 DES 위해 적응하고 신속 3 Asynchronous encryption in Swift :신속한 3.1 DES/ECB/NoPadding 일반적인 암호화 사용

func testCrypt(data:NSData, keyData:NSData, ivData:NSData, operation:CCOperation) -> NSData? { 

    let keyBytes = keyData.bytes.assumingMemoryBound(to: UInt8.self) 
    print("keyLength = \(keyData.length), keyData = \(keyData)") 

    let ivBytes = ivData.bytes.assumingMemoryBound(to: UInt8.self) 
    print("ivLength = \(ivData.length), ivData = \(ivData)") 

    let dataLength = Int(data.length) 

    let dataBytes = data.bytes.assumingMemoryBound(to: UInt8.self) 
    print("dataLength = \(dataLength), data  = \(data)") 

    let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeDES) 

    let cryptPointer = cryptData.mutableBytes.assumingMemoryBound(to: UInt8.self) 
    let cryptLength = size_t(cryptData.length) 

    let keyLength    = size_t(kCCKeySizeDES) 
    let algoritm: CCAlgorithm = UInt32(kCCAlgorithmDES) 
    let options: CCOptions = UInt32(kCCOptionECBMode) 

    var numBytesEncrypted :size_t = 0 

    let cryptStatus = CCCrypt(operation, 
           algoritm, 
           options, 
           keyBytes, keyLength, 
           ivBytes, 
           dataBytes, dataLength, 
           cryptPointer, cryptLength, 
           &numBytesEncrypted) 

    return cryptData; 
} 

함수 호출 및 매개 변수 :

override func viewDidLoad() { 
    super.viewDidLoad() 

    let ivString = "Use a random iv!" 
    let ivData = (ivString as NSString).data(using: String.Encoding.utf8.rawValue) as NSData! 

    let key = Data.init(bytes: [0x23, 0x12, 0x4d, 0x89, 0x88, 0x34, 0xCf, 0x50]) 
    let keyData = NSData.init(data: key) 

    let message = "Don´t try to read this text. Top Secret Stuff" 
    let data = (message as NSString).data(using: String.Encoding.utf8.rawValue) as NSData! 

    print("data: \(data)") 
    if let encryptedData = testCrypt(data: data!, keyData:keyData, ivData: ivData!, operation:UInt32(kCCEncrypt)) { 
     print("encryptedData: \(encryptedData)") 
     if let decryptedData = testCrypt(data: encryptedData, keyData:keyData, ivData: ivData!, operation:UInt32(kCCDecrypt)) { 
      let dec = Data.init(referencing: decryptedData) 
      print("decryptedData: \(decryptedData))") 
     } 
    } 
} 

예상 결과 = < 446f6ec2 b4742074 72792074 6f207265 61,642,074 68,697,320 74,657,874 2e20546f 70,205,365 63,726,574 20,537,475 6666>

의 EncryptedData : < 6081ada9 0487c0a5 35e542bd e9600861 4250a693 655 73,337 39df5525 66c40cd8 b358bf6a d9837f9c 00000000 00000000 00000000 0000>

decryptedData = < 446f6ec2 b4742074 72792074 6f207265 61,642,074 68,697,320 74,657,874 2e20546f 70,205,365 63,726,574 e0456e88 3f896b9b 00000000 00000000 00000000 0000>

암호 해독은 일부 권리 결과를 반환하는 이유

?

+0

코드의 출처는 어디입니까? 입력 데이터, 예상 출력 및 실제 출력은 무엇입니까? "이상한 결과"는 무엇을 의미합니까? –

+0

@MartinR 세부 정보가 유감 스럽지만, 내 질문을 업데이트했습니다. – JamesRGNT

답변

0

그래서 NoPadding 옵션을 사용할 수 없으므로 'cryptData'초기화에서 '+ kCCBlockSizeDES'를 제거하고 올바른 문자열에 도달하기 위해 암호화하기 전에 '0'문자를 내 문자열에 추가했습니다 (예 : 8의 길이 배수) 그리고 암호 해독 후에 나는 원래 문자열을 얻기 위해 0을 제거했다.