web-dev-qa-db-ja.com

単純なJavascript暗号化、PHP共有秘密鍵で復号化

これはセキュリティに関するものではありません。壊れにくくすることでもありません。文字列(URL)を元の文字列に似ていない方法で変更する簡単なアルゴリズムを探しています。 暗号化はjavascriptで行われます。次に、encrypted文字列をPHP関数にフィードして、元の文字列に戻します。両端が可能です。秘密鍵を共有するか、変換が鍵なしで論理のみに依存する可能性があります。

理想的なソリューション

  1. シンプルになります
  2. 暗号化に利用可能なJavaScript関数を使用します
  3. 復号化に利用可能なphp関数を使用します
  4. 平文にまったく似ていない方法で暗号化された文字列を生成します
  5. 暗号化された文字列には小文字のアルファベットと数字のみが使用されます
  6. 暗号化としてBase64-ingのように広く使用されている方法ではありません。

編集:最後の要件は shamittomar の回答の後に追加されました。

15

それが必要な場合は、Base64でエンコードおよびデコードできます。

[編集]:OPの説明後:

広く使用されているメソッドは必要ないため、ここではまれに使用されるメソッドを1つ示します。これは、小文字と数字のみで出力することで実行できます。 Base32エンコード/デコードです。次のライブラリを使用します。

12
shamittomar

Javascriptでビット単位のXORを使用して文字列をエンコードし、PHPで再度デコードすることができます。Javascriptの小さな例を作成しました。これは、 PHPでも同じです。すでにエンコードされた文字列を使用してもう一度enc()を呼び出すと、元の文字列が再び取得されます。

<html>
<head><title></title></head>
<body>
<script type="text/javascript">
function enc(str) {
    var encoded = "";
    for (i=0; i<str.length;i++) {
        var a = str.charCodeAt(i);
        var b = a ^ 123;    // bitwise XOR with any number, e.g. 123
        encoded = encoded+String.fromCharCode(b);
    }
    return encoded;
}
var str = "hello world";
var encoded = enc(str);
alert(encoded);           // shows encoded string
alert(enc(encoded));      // shows the original string again
</script>
</body>
</html>

PHPで次のようなことを行います(注意、これはテストされておらず、PHPを実行してから長い時間が経過しています):

$encoded = "...";   // <-- encoded string from the request
$decoded = "";
for( $i = 0; $i < strlen($encoded); $i++ ) {
    $b = ord($encoded[$i]);
    $a = $b ^ 123;  // <-- must be same number used to encode the character
    $decoded .= chr($a)
}
echo $decoded;
26
Ridcully

それがセキュリティではなく、壊れにくくすることでもないのなら、ROT-13はどうですか?

//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/string/rot13 [rev. #1]

String.prototype.rot13 = function(){
    return this.replace(/[a-zA-Z]/g, function(c){
        return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
    });
};

...

var s = "My String";

var enc = s.rot13();  // encrypted value in enc

PHPにはネイティブ関数str_rot13があります: http://php.net/manual/en/function.str-rot13.php

$decrypted = str_rot13($_GET['whatever']);
6
Fosco

Javascriptでシークレットをどのように実装(非表示)する予定ですか?私見それは不可能です。

編集:OK-セキュリティについてではありません。次に、baseXXまたはrotエンコーディングメカニズムを使用してください。しかし、これらのアルゴリズムの1つがよく知られていないとは本当に言えません...

1
Jan.

さて、私はこのページを見つけて、Redcullyのプログラムが私のために機能しないのを見つけたので、それは他のすべてで起こると思いました。ついに理由がわかり、修正しました。ここに新しいコードがあります... Redcullyに感謝します:)

JS関数:

function encode(str) {
  var encoded = "";
  for (i=0; i<str.length;i++) {
    var a = str.charCodeAt(i);
    var b = a ^ 51;    // bitwise XOR with any number, e.g. 123
    encoded = encoded+String.fromCharCode(b);
  }
  return encoded;
}

PHP関数:

function decode($encoded) {
  $decoded = "";
  for( $i = 0; $i < strlen($encoded); $i++ ) {
    $b = ord($encoded[$i]);
    $a = $b ^ 51;  // <-- must be same number used to encode the character
    $decoded .= chr($a);
  }
  return $decoded;
}
1
Manav Akela