【问题标题】:Simple Javascript encrypt, PHP decrypt with shared secret key简单的 Javascript 加密,PHP 使用共享密钥解密
【发布时间】:2011-04-06 06:12:13
【问题描述】:

这与安全无关。也不要让它难以破解。我正在寻找一种简单的算法来以一种与原始字符串不同的方式更改字符串(url)。 加密 将使用 javascript 完成。然后我想将 encrypted 字符串提供给 PHP 函数以将其更改回原始字符串。两端可以共享一个密钥,或者转换可以是无密钥的并且仅依赖于逻辑。

理想的解决方案

  1. 会很简单
  2. 将使用可用的 javascript 函数进行加密
  3. 将使用可用的 php 函数进行解密
  4. 将以完全不类似于纯文本的方式生成加密字符串
  5. 将仅在加密字符串中使用小写字母字符和数字
  6. 不是像 Base64-ing 那样广泛使用的加密方法。

编辑:最后一个要求是在shamittomar 的回答之后添加的。

【问题讨论】:

  • 通过在 javascript 中执行此操作,客户端可以轻松查看源代码并解密您的加密字符串。
  • @Chris - 这不会造成问题;正如我在问题中所说,这不是为了安全或保密。
  • 这就是为什么我只是将其作为评论发布,以确保您知道仅此而已。正如其他人所说,您的 javascript 和 php 可用的任何散列算法都可以正常工作。 md5、base64、sha 都可以。
  • 注意 md5 和 sha 是一种单向哈希算法,在这种情况下不适用,因为 OP 想要解密加密的字符串。
  • @My1 在我的国家,很多网站都被屏蔽了。早在那个时候,这个问题被问到 vpns 很难找到,许多人不得不依赖网络代理(他们自己在 http 上)。过滤足够聪明,可以反转目标 url 的 base64 编码,但仍会阻止请求。我可以访问一个这样的代理 (PHP) 的源代码,并希望将方法从 base64 编码更改为不同的方法来解决这个问题。相关:this 和 this。

标签: php javascript algorithm encryption


【解决方案1】:

如果这是您想要的,您可以Base64对其进行编码和解码。

[编辑]:OP 澄清后:

由于您不想要广泛使用的方法,这里有一种很少使用的方法,它可以通过仅以小写字母和数字提供输出来为您做到这一点。它是 Base32 Encode/Decode。使用以下库:

【讨论】:

  • 谢谢。我可能应该在我的问题中说明广泛使用的转换方法不适合。我将编辑我的问题以澄清这一点。
  • 谢谢!我可能会链接不止一种方法来让它独一无二。
  • PHP 链接已失效 :(
  • @jonny,链接已更新,感谢您提醒我。
【解决方案2】:

我找到了这个页面,发现 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;
}

【讨论】:

    【解决方案3】:

    您可以在 javascript 中使用按位异或对字符串进行编码,然后在 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;
    

    【讨论】:

    • +1 谢谢 Ridcully,感谢您为此付出的努力和时间。
    • php 端是如何工作的?对此的新手..但对它说“它在PHP中的工作原理相同”感到困惑。当我查找 XOR 时,它也有一个键
    • 在 PHP 中,您的操作与在 Javascript 中完全相同。首先,定义一个变量 $decoded = ""。然后遍历编码字符串的字符,并与在 Javascript 端用于编码的 same 数字进行按位异或。因此,您再次获得原始角色。您将解码后的字符附加到 $decoded 并以原始字符串结尾。这一切都是基于这样一个事实,即如果您应用两次按位异或,您将再次获得原始值。
    • @crosenblum 我在答案中添加了一个 PHP sn-p。
    • 只有我这个代码有问题吗?如果我使用数字 123,那么所有“{”都会从我的字符串中消失。如果我使用 ascii 表中的数字,ascii 表中的每个字符都会消失。
    【解决方案4】:

    您打算如何在 Javascript 中实现(隐藏)秘密?恕我直言,这是不可能的。

    编辑:好的 - 不是关于安全性..然后只需使用任何 baseXX 或 rot 编码机制。但是你不能真的说这些算法中的一种不会为人所知......

    【讨论】:

    • 目的不是隐藏秘密
    • @Majid 如果密钥不是秘密,那么加密的用途是什么?
    • 我认为他的意思是哈希不加密。
    • 嗯..哈希与秘密无关,也与加密无关。 OP 明确表示他想加密某些东西并补充说:“然后我想将加密的字符串提供给 PHP 函数以将其改回原始字符串”。
    • @Max - 它是通过更复杂的过滤来解码代理的 url 以查看正在通过代理访问的站点。
    【解决方案5】:

    如果不是为了安全,也不是为了让它难以破解,那么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']);
    

    【讨论】:

    • 但是 OP 希望使用 URL 作为输入。而Rot-13 则保持非字母字符不变。这可能会输出 / 和 : 字符,但 OP 只希望输出 小写和数字。此外,由于非 alpha 字符未被触及,因此预测编码字符串是 URL 非常简单。
    • @shamittomar,做出此答案时,没有关于作为输入的 URL 的评论。我根据要求基本上是半开玩笑的回答。
    • 这个问题的修订表明最初的帖子包含以下内容:...to change a string (a url) in a way...。你可能错过了:)。没问题。
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2020-04-23
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多