Ciphering with TripleDES in outer CBC mode using 2 keys
Written by Sentha on April 2, 2013
Recently, I was working on a project to implement the 3GPP TS 23.048 specification. It’s a specification which deals with security mechanisms for the (U)SIM application toolkit. Under a particular section (KIC and KID), I have to implement the Triple DES in outer CBC mode with 2 keys. Well, I initially implemented using python/Crypto library. Later I implemented it using Go.
Triple DES is a block cipher/encryption algorithm. In other words, applying DES algorithm 3 times on each block. Generally we have to use 3 keys, but current sim cards supports only 2 keys (or maybe the sim card which I used was following 2 keys standard). Enough with theory, lets get into action.
package main
import (
"log"
"fmt"
"crypto/des"
"crypto/cipher"
"encoding/hex"
)
func main(){
kic := "7962D9ECE03D1ACD4C76089DCE131543" //its a 16 bytes key (values in hex)
initialVector := "0000000000000000" //8 bytes
plainText := "112233445566778811223344556677881122334455667788" // length must be multiply of 8
//convert the kic to 3 keys (k1, k2, k3 where k1 != k2 and k1 == k3)
kic = fmt.Sprintf("%s%s", kic, kic[0:16])
key, _ := hex.DecodeString(kic);
iv, _ := hex.DecodeString(initialVector)
src, _ := hex.DecodeString(plainText)
dest := make([]byte, len(src))
tdes, err := des.NewTripleDESCipher(key); if err != nil{
log.Fatal(err)
}
encrypt := cipher.NewCBCEncrypter(tdes, iv)
encrypt.CryptBlocks(dest, src)
log.Println("Plain value :", plainText)
log.Println("Cipher value :", hex.EncodeToString(dest))
}
Thats it, using standard Go library we can implement the entire 3GPP TS 23.048 specification.