Total Commander FTP Password Recovery — SDK

Decode Total Commander FTP passwords. Installable packages for PHP, Python, JavaScript (Node.js), Rust, C#, Go, Java, PowerShell, and Ruby.

Description

The Total Commander FTP Password Recovery libraries mirror the decryption algorithm used on this site. Each package runs offline on your machine — use them to decode ciphertext from wcx_ftp.ini (hex fields) or to build your own tools and automation. Flexible hex input is supported (case ignored; spacing between byte pairs allowed), which helps when pasting directly from an .ini file.

Installation

Official releases are published to Packagist, PyPI, npm, crates.io, NuGet, pkg.go.dev, Maven, PowerShell Gallery, and RubyGems. Source is on GitHub.

Language Installation Package Sources
PHP programming language

Run:

php composer.phar require --prefer-dist pelock/total-commander-ftp-password-recovery "*"

or add the following to require section of your composer.json file

"pelock/total-commander-ftp-password-recovery": "*"
Packagist GitHub
Python programming language pip install total-commander-ftp-password-recovery PyPI GitHub
JavaScript programming language

Run

npm install total-commander-ftp-password-recovery

or add the following to dependencies section of your package.json file

"dependencies": {
  "total-commander-ftp-password-recovery": "latest"
},

npm GitHub
Rust / Cargo

Run:

cargo add total-commander-ftp-password-recovery

or add the following to [dependencies] section of your Cargo.toml file

total-commander-ftp-password-recovery = "1"
Crates GitHub
NuGet / C#

Run:

dotnet add package PELock.TotalCommanderFtpPasswordRecovery

or add to your .csproj:

<PackageReference Include="PELock.TotalCommanderFtpPasswordRecovery" Version="1.0.1" />
NuGet GitHub
Go module packages

Run:

go get github.com/PELock/Total-Commander-FTP-Password-Recovery-Go

or add the following to your go.mod file

require github.com/PELock/Total-Commander-FTP-Password-Recovery-Go v1.0.1
Go GitHub
Maven Central Repository Add this dependency to your pom.xml
<dependency>
  <groupId>com.pelock</groupId>
  <artifactId>total-commander-ftp-password-recovery</artifactId>
  <version>1.0.1</version>
</dependency>
Maven GitHub
PowerShell Gallery

Run:

Install-Module -Name TotalCommanderFtpPasswordRecovery

or:

Install-PSResource -Name TotalCommanderFtpPasswordRecovery

PowerShell Gallery GitHub
RubyGems repository

Run:

gem install total-commander-ftp-password-recovery

or add the following to your Gemfile

gem "total-commander-ftp-password-recovery"
RubyGems GitHub

Usage examples

Decode a single ciphertext (hex string)

<?php

declare(strict_types=1);

require __DIR__ . '/vendor/autoload.php';

use PELock\TotalCommanderFtpPassword\TotalCommanderPasswordDecoder;

$cipherHex = '00112233445566778899aabbccddeeff';

$decoder = new TotalCommanderPasswordDecoder();
$plain = $decoder->decryptPassword($cipherHex);

if ($plain === false) {
    throw new RuntimeException('Invalid ciphertext (bad hex, odd length, or too short).');
}

echo $plain;
echo bin2hex($plain);
from binascii import hexlify

from total_commander_ftp_password import TotalCommanderPasswordDecoder

cipher_hex = "00112233445566778899aabbccddeeff"

decoder = TotalCommanderPasswordDecoder()
plain = decoder.decrypt_password(cipher_hex)

if plain is None:
    raise RuntimeError("Invalid ciphertext (bad hex, odd length, or too short).")

print(plain)
print(hexlify(plain).decode("ascii"))
import { Buffer } from 'node:buffer';
import { TotalCommanderPasswordDecoder } from 'total-commander-ftp-password-recovery';

const cipherHex = '00112233445566778899aabbccddeeff';

const decoder = new TotalCommanderPasswordDecoder();
const plain = decoder.decryptPassword(cipherHex);

if (plain === null) {
  throw new Error('Invalid ciphertext (bad hex, odd length, or too short).');
}

console.log(Buffer.from(plain).toString('latin1'));
console.log(Buffer.from(plain).toString('hex'));
use total_commander_ftp_password_recovery::TotalCommanderPasswordDecoder;

let cipher_hex = "00112233445566778899aabbccddeeff";

let mut decoder = TotalCommanderPasswordDecoder::new();
let plain = decoder
    .decrypt_password(cipher_hex)
    .expect("Invalid ciphertext (bad hex, odd length, or too short).");

let latin1: String = plain.iter().map(|&b| char::from(b)).collect();
println!("{latin1}");

print!("hex: ");
for b in &plain {
    print!("{b:02x}");
}
println!();
/******************************************************************************
 * Total Commander FTP Password Recovery usage example.
 *
 * Version        : v1.0.1
 * Language       : C#
 * Author         : Bartosz Wójcik
 * Web page       : https://www.pelock.com
 *
 *****************************************************************************/

using PELock.TotalCommanderFtpPasswordRecovery;

const string cipherHex = "00112233445566778899aabbccddeeff";
var decoder = new TotalCommanderPasswordDecoder();
var plain = decoder.DecryptPassword(cipherHex);

if (plain is null)
{
    Console.Error.WriteLine("Decode failed.");
    return 1;
}

Console.WriteLine(System.Text.Encoding.Latin1.GetString(plain));
Console.WriteLine("hex: " + Convert.ToHexString(plain).ToLowerInvariant());
return 0;
/******************************************************************************
 * Total Commander FTP Password Recovery usage example.
 *
 * Version        : v1.0.1
 * Language       : Go
 * Author         : Bartosz Wójcik
 * Web page       : https://www.pelock.com
 *
 *****************************************************************************/

package main

import (
	"encoding/hex"
	"fmt"
	"os"

	totalcommanderftppasswordrecovery "github.com/PELock/Total-Commander-FTP-Password-Recovery-Go"
)

func main() {
	const cipherHex = "00112233445566778899aabbccddeeff"
	decoder := totalcommanderftppasswordrecovery.New()
	plain, err := decoder.DecryptPassword(cipherHex)
	if err != nil {
		fmt.Fprintln(os.Stderr, "Decode failed.")
		os.Exit(1)
	}
	fmt.Println(string(plain))
	fmt.Println("hex: " + hex.EncodeToString(plain))
}
/******************************************************************************
 * Total Commander FTP Password Recovery usage example.
 *
 * Version        : v1.0.1
 * Language       : Java
 * Author         : Bartosz Wójcik
 * Web page       : https://www.pelock.com
 *
 *****************************************************************************/

import com.pelock.totalcommander.TotalCommanderPasswordDecoder;

public class BasicUsage {

  public static void main(String[] args) {
    String cipherHex = "00112233445566778899aabbccddeeff";
    TotalCommanderPasswordDecoder decoder = new TotalCommanderPasswordDecoder();
    byte[] plain = decoder.decryptPassword(cipherHex);

    if (plain == null) {
      System.err.println("Decode failed.");
      System.exit(1);
    }

    System.out.println(decoder.decryptPasswordString(cipherHex));
    StringBuilder hex = new StringBuilder();
    for (byte b : plain) {
      hex.append(String.format("%02x", b & 0xFF));
    }
    System.out.println("hex: " + hex);
  }
}
################################################################################
#
# Total Commander FTP password decoder usage example.
#
# Decrypt a hex password stored in wcx_ftp.ini.
#
# Version        : v1.0.0
# Language       : PowerShell
# Author         : Bartosz Wójcik
# Web page       : https://www.pelock.com
#
################################################################################

using module TotalCommanderFtpPasswordRecovery

$decoder = New-TotalCommanderPasswordDecoder
$bytes = $decoder.DecryptPassword('00112233445566778899aabbccddeeff')

if ($null -eq $bytes) {
    Write-Host 'Could not decrypt the password (invalid hex or too short).'
}
else {
    $hex = [BitConverter]::ToString($bytes).Replace('-', '').ToLowerInvariant()
    Write-Host ("Decrypted bytes (hex): {0}" -f $hex)
}
# frozen_string_literal: true

###############################################################################
#
# Total Commander FTP Password Recovery
#
# Version        : v1.0.1
# Language       : Ruby
# Author         : Bartosz Wójcik
# Web page       : https://www.pelock.com
#
###############################################################################

require "total-commander-ftp-password-recovery"

cipher_hex = "00112233445566778899aabbccddeeff"
decoder = TotalCommanderPasswordDecoder.new
plain = decoder.decrypt_password(cipher_hex)

if plain.nil?
  warn "Decode failed."
  exit 1
end

puts decoder.decrypt_password_string(cipher_hex)
puts "hex: #{plain.map { |b| format("%02x", b) }.join}"

Command-line helpers

Each package ships a small tc-ftp-password-decode helper (via Composer vendor/bin, pip console scripts, npx, or cargo install). Example:

tc-ftp-password-decode 00112233445566778899aabbccddeeff

Requirements

Questions?

If you would like to ask me about Total Commander FTP Password Recovery SDKs, or something's not clear, mail me. I'll be happy to answer all of your questions.