私はすでにRSA経由でランダムな対称鍵を共有することができました. ただし、aes-encryption を使用することはできません。問題は、cryptoJS が使用するソルトと初期化ベクトルにあるようです。
まず、出力は次のようになります。
U2FsdGVkX19wbzVqqOr6U5dnuG34WyH+n1A4PX9Z+xBhY3bALGS7DOa/aphgnubc
悲しいことに、繰り返し発生する「U2FsdGVkX」または「cryptoJS.AES出力」のグーグルは役に立ちません。
一方、golang の aes では、32 ビット キーとそれぞれ 32 ビット長の入力のみが必要です。つまり、何らかの方法で上記を対応するブロックに分割し、秘密鍵と上記のデータ (おそらくソルト + 初期ベクトルを含む) から 32 ビット キーを作成する方法を見つけ出す必要があります。
悲しいことに、 http://code.google.com/p/crypto-jsも Google 検索も解決策を提供してくれません。
ちなみに、今の私の暗号化:
var arr = new Array(32);
symetricKey = "";
var symHex = "";
rng.nextBytes(arr);
for(var i = 0; i < arr.length; i++){
symetricKey += String.fromCharCode(arr[i]);
//symHex= arr[i].toString(16), added a 0 if needed (so length always increases by 2)
}
//submit symetric via rsa. This is working, the server gets that key
var enc = CryptoJS.AES.encrypt(unencrypted, symetricKey)
//submit enc, stuck now - what to do with it on the server?
編集: Base64 応答の後:
base64 の入力に感謝します。
しかし、私はまだそれを機能させることができません。
特に、エンコードされた文字列が「SALTED」で始まるため、問題がある可能性があると思います。
今エンコードしようとしている方法:
クライアントでエンコード:
var unencrypted = "{mail:test,password:test}"
var enc = CryptoJS.AES.encrypt(unencrypted, symKey)
サーバーでは、変数 enc と symKey はクライアントと同じです。
baseReader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(enc))
encData, err := ioutil.ReadAll(baseReader)
//if err != nil { ....}, doesn't happen here
cipher, err := aes.NewCipher(symKey)
//if err != nil { ....}, doesn't happen here
byteData := make([]byte, len(encData))
cipher.Decrypt(byteData, encData)
fmt.Println("Dec: ", string(byteData))
//Outputs unrepresentable characters
何か案が?