Swift Encryption

Swift Encryption

Swift is Apple’s main language for iOS, macOS, watchOS, and tvOS apps, and it is creeping into server projects too. You work with readable source until Xcode produces an IPA or binary—then curious people start poking the package with off-the-shelf tools.

OAuth client IDs aren’t secret, but backend URLs, trial licence strings, and internal API keys deserve more than a naked String in source. StringEncrypt outputs Swift that rebuilds the text at runtime so casual string dumps take more work.

String encryption supports both UNICODE and ANSI strings.

Official resources:

Swift Encryption (UNICODE Example)

Plaintext reference: StringEncrypt sample

// encrypted with https://www.stringencrypt.com (v1.5.0) [Swift]
// myString = "StringEncrypt sample"
var myString: String = ""

var XsiKG: [UInt16] = [ 0xCEE2, 0xD264, 0xAE6C, 0xBA48, 0xA65C, 0xBEBB, 0xAA31, 0xBA5C,
                        0xAAAB, 0xB26C, 0x9A01, 0x8A54, 0x8664, 0x99D2, 0x8E60, 0x86A3,
                        0x8658, 0x9254, 0x6E44, 0x76B3 ]

var CjFAv: UInt16 = 0
for QFCkU in 0..<20
{
	CjFAv = UInt16(XsiKG[QFCkU])
	for _ in 0..<2
	{
		CjFAv = (CjFAv ^ (((CjFAv & UInt16(0xFFFF)) << 10) & UInt16(0xFFFF))) & UInt16(0xFFFF)
		CjFAv = (((CjFAv & UInt16(0xFFFF)) >> 3) | ((CjFAv & UInt16(0xFFFF)) << 13)) & UInt16(0xFFFF)
	}
	for _ in 0..<2
	{
		CjFAv = (CjFAv ^ (((CjFAv & UInt16(0xFFFF)) << 13) & UInt16(0xFFFF))) & UInt16(0xFFFF)
		for _ in 0..<2
		{
			CjFAv = (CjFAv ^ ((CjFAv & UInt16(0xFFFF)) >> 14)) & UInt16(0xFFFF)
		}
		CjFAv = (((CjFAv & UInt16(0xFFFF)) << 15) | ((CjFAv & UInt16(0xFFFF)) >> 1)) & UInt16(0xFFFF)
	}
	CjFAv = ((CjFAv & UInt16(0xFFFF)) &+ UInt16(0xA23B)) & UInt16(0xFFFF)
	CjFAv = (((CjFAv & UInt16(0xFFFF)) >> 8) | ((CjFAv & UInt16(0xFFFF)) << 8)) & UInt16(0xFFFF)
	CjFAv = (((CjFAv & UInt16(0xFFFF)) << 6) | ((CjFAv & UInt16(0xFFFF)) >> 10)) & UInt16(0xFFFF)
	CjFAv = (((CjFAv & UInt16(0xFFFF)) >> 8) | ((CjFAv & UInt16(0xFFFF)) << 8)) & UInt16(0xFFFF)
	CjFAv = ((CjFAv & UInt16(0xFFFF)) &- UInt16(QFCkU)) & UInt16(0xFFFF)
	CjFAv = (CjFAv ^ UInt16(0xFFFF)) & UInt16(0xFFFF)
	for _ in 0..<2
	{
		CjFAv = ((CjFAv & UInt16(0xFFFF)) &- UInt16(QFCkU)) & UInt16(0xFFFF)
		CjFAv = (((CjFAv & UInt16(0xFFFF)) >> 8) | ((CjFAv & UInt16(0xFFFF)) << 8)) & UInt16(0xFFFF)
	}
	CjFAv = (CjFAv ^ UInt16(0xFFFF)) & UInt16(0xFFFF)
	XsiKG[QFCkU] = UInt16(CjFAv)
	myString = String(decoding: XsiKG, as: UTF16.self)
}

Swift Encryption (ANSI Example)

Plaintext reference: StringEncrypt sample

// encrypted with https://www.stringencrypt.com (v1.5.0) [Swift]
// myString = "StringEncrypt sample"
var myString: String = ""

var FWrcq: [UInt8] = [ 0xDE, 0xED, 0x12, 0xD1, 0x06, 0x38, 0x1A, 0x80,
                       0xBD, 0x0B, 0x69, 0x83, 0x18, 0x1B, 0x9E, 0x71,
                       0x67, 0x7E, 0x1F, 0xE0 ]

var kcbaG: UInt8 = 0
for uCikj in 0..<20
{
	kcbaG = UInt8(FWrcq[uCikj])
	kcbaG = (kcbaG ^ UInt8(0x36)) & UInt8(0xFF)
	for _ in 0..<3
	{
		kcbaG = ((kcbaG & UInt8(0xFF)) &- UInt8(1)) & UInt8(0xFF)
		kcbaG = ((kcbaG & UInt8(0xFF)) &+ UInt8(0xD4)) & UInt8(0xFF)
		kcbaG = (((kcbaG & UInt8(0xFF)) << 3) | ((kcbaG & UInt8(0xFF)) >> 5)) & UInt8(0xFF)
	}
	kcbaG = ((kcbaG & UInt8(0xFF)) &- UInt8(0x04)) & UInt8(0xFF)
	kcbaG = (kcbaG ^ UInt8(0x03)) & UInt8(0xFF)
	for _ in 0..<2
	{
		for _ in 0..<4
		{
			for _ in 0..<4
			{
				kcbaG = (((kcbaG & UInt8(0xFF)) >> (uCikj % 8)) | ((kcbaG & UInt8(0xFF)) << (8 - (uCikj % 8)))) & UInt8(0xFF)
				kcbaG = ((kcbaG & UInt8(0xFF)) &+ UInt8(0x2D)) & UInt8(0xFF)
			}
		}
		kcbaG = ((kcbaG & UInt8(0xFF)) &- UInt8(0x7B)) & UInt8(0xFF)
		kcbaG = (kcbaG ^ UInt8(uCikj)) & UInt8(0xFF)
	}
	for _ in 0..<2
	{
		for _ in 0..<3
		{
			kcbaG = (((kcbaG & UInt8(0xFF)) << (uCikj % 8)) | ((kcbaG & UInt8(0xFF)) >> (8 - (uCikj % 8)))) & UInt8(0xFF)
			for _ in 0..<4
			{
				kcbaG = (kcbaG ^ ((kcbaG & UInt8(0xFF)) >> 6)) & UInt8(0xFF)
			}
		}
		kcbaG = (kcbaG ^ UInt8(0x54)) & UInt8(0xFF)
		kcbaG = (((~(kcbaG & UInt8(0xFF))) & UInt8(0xFF)) &+ UInt8(1)) & UInt8(0xFF)
	}
	kcbaG = (kcbaG ^ (((kcbaG & UInt8(0xFF)) << 5) & UInt8(0xFF))) & UInt8(0xFF)
	for _ in 0..<2
	{
		for _ in 0..<4
		{
			for _ in 0..<4
			{
				kcbaG = (kcbaG ^ UInt8(0x60)) & UInt8(0xFF)
				kcbaG = (kcbaG ^ UInt8(uCikj)) & UInt8(0xFF)
			}
			kcbaG = (kcbaG ^ UInt8(0xFF)) & UInt8(0xFF)
		}
		for _ in 0..<3
		{
			for _ in 0..<2
			{
				kcbaG = (((kcbaG & UInt8(0xFF)) >> 4) | ((kcbaG & UInt8(0xFF)) << 4)) & UInt8(0xFF)
				kcbaG = ((kcbaG & UInt8(0xFF)) &+ UInt8(uCikj)) & UInt8(0xFF)
				kcbaG = ((kcbaG & UInt8(0xFF)) &- UInt8(0xAD)) & UInt8(0xFF)
			}
		}
		for _ in 0..<2
		{
			for _ in 0..<4
			{
				kcbaG = (kcbaG ^ UInt8(0xFF)) & UInt8(0xFF)
				kcbaG = ((kcbaG & UInt8(0xFF)) &+ UInt8(uCikj)) & UInt8(0xFF)
				kcbaG = (kcbaG ^ UInt8(0xFF)) & UInt8(0xFF)
			}
			kcbaG = ((kcbaG & UInt8(0xFF)) &- UInt8(uCikj)) & UInt8(0xFF)
		}
	}
	kcbaG = ((kcbaG & UInt8(0xFF)) &+ UInt8(0x6B)) & UInt8(0xFF)
	for _ in 0..<3
	{
		kcbaG = ((kcbaG & UInt8(0xFF)) &+ UInt8(1)) & UInt8(0xFF)
		for _ in 0..<3
		{
			for _ in 0..<2
			{
				kcbaG = (kcbaG ^ UInt8(0xFF)) & UInt8(0xFF)
			}
			kcbaG = ((kcbaG & UInt8(0xFF)) &- UInt8(uCikj)) & UInt8(0xFF)
			kcbaG = ((kcbaG & UInt8(0xFF)) &+ UInt8(0x43)) & UInt8(0xFF)
		}
		kcbaG = (kcbaG ^ UInt8(0xEF)) & UInt8(0xFF)
	}
	kcbaG = (kcbaG ^ UInt8(uCikj)) & UInt8(0xFF)
	FWrcq[uCikj] = UInt8(kcbaG)
	myString = String(decoding: FWrcq, as: UTF8.self)
}